작성한 내용에 따라 클래스와 객체의 차이라는 중요한 이해 부분을 놓치고 있습니다. __init__
클래스를 초기화하지 않고 클래스 또는 객체의 인스턴스를 초기화합니다. 개마다 색깔이 있지만 반 개는 색깔이 없습니다. 각 개는 4 개 이하의 발을 가지고 있지만 개 종류는 그렇지 않습니다. 클래스는 객체의 개념입니다. Fido와 Spot을 보면 그들의 유사성, 개성을 알 수 있습니다. 그게 수업입니다.
당신이 말할 때
class Dog:
def __init__(self, legs, colour):
self.legs = legs
self.colour = colour
fido = Dog(4, "brown")
spot = Dog(3, "mostly yellow")
Fido는 다리가 4 개인 갈색 개이고 Spot은 약간의 불구이고 대부분 노란색입니다. 이 __init__
함수는 생성자 또는 이니셜 라이저라고하며 클래스의 새 인스턴스를 만들 때 자동으로 호출됩니다. 해당 함수 내에서 새로 생성 된 객체가 매개 변수에 할당됩니다 self
. 표기법 self.legs
은 legs
변수의 객체에 대해 호출되는 속성 self
입니다. 속성은 일종의 변수이지만 객체의 상태 또는 객체에 사용할 수있는 특정 작업 (함수)을 설명합니다.
그러나 colour
개성 자체를 설정 하는 것이 아니라 추상적 인 개념입니다. 클래스에서 의미가있는 속성이 있습니다. 예를 들어, population_size
Fido는 항상 하나이기 때문에 Fido를 계산하는 것은 의미가 없습니다. 개를 세는 것이 합리적입니다. 전 세계에 2 억 마리의 개가 있다고합시다. Dog 클래스의 속성입니다. Fido는 2 억이라는 숫자와 관련이 없으며 Spot도 마찬가지입니다. colour
이상인 "인스턴스 속성"과 달리 "클래스 속성"이라고합니다 legs
.
이제는 개가 적고 프로그래밍과 관련된 것입니다. 내가 아래에 쓰는 것처럼 물건을 추가하는 클래스는 합리적이지 않습니다. 어떤 클래스입니까? Python의 클래스는 유사하게 작동하는 서로 다른 데이터 모음으로 구성됩니다. 개 종류는 Fido와 Spot 및 그들과 유사한 다른 동물 199999999998로 구성되어 있으며 모두 가로등 기둥에서 오줌 누고 있습니다. 물건을 추가하는 수업은 무엇으로 구성되어 있습니까? 그들에게 내재 된 어떤 데이터가 다른가? 그리고 그들은 어떤 행동을 공유합니까?
하지만 숫자는 ... 더 흥미로운 주제입니다. 정수라고 말하십시오. 개보다 훨씬 많은 것들이 있습니다. 나는 파이썬이 이미 정수를 가지고 있다는 것을 알고 있지만, 바보처럼 놀고 (파이썬의 정수를 속이고 사용함으로써) 그것들을 다시 "구현"합시다.
따라서 정수는 클래스입니다. 일부 데이터 (가치)와 일부 동작 ( "이 다른 숫자에 나를 추가")이 있습니다. 이것을 보여 봅시다 :
class MyInteger:
def __init__(self, newvalue)
# imagine self as an index card.
# under the heading of "value", we will write
# the contents of the variable newvalue.
self.value = newvalue
def add(self, other):
# when an integer wants to add itself to another integer,
# we'll take their values and add them together,
# then make a new integer with the result value.
return MyInteger(self.value + other.value)
three = MyInteger(3)
# three now contains an object of class MyInteger
# three.value is now 3
five = MyInteger(5)
# five now contains an object of class MyInteger
# five.value is now 5
eight = three.add(five)
# here, we invoked the three's behaviour of adding another integer
# now, eight.value is three.value + five.value = 3 + 5 = 8
print eight.value
# ==> 8
이것은 약간 취약하지만 (우리는 other
MyInteger 라고 가정하고 있음) 지금은 무시합니다. 실제 코드에서는 그렇지 않습니다. 우리는 그것을 확인하기 위해 그것을 테스트 할 것이고, 어쩌면 그것을 강요 할 수도 있습니다 ( "당신은 정수가 아닙니다? golly에 의해, 당신은 하나가되는 데 10 나노초가 있습니다! 9 ... 8 ....")
분수를 정의 할 수도 있습니다. 분수는 자신을 더하는 방법도 알고 있습니다.
class MyFraction:
def __init__(self, newnumerator, newdenominator)
self.numerator = newnumerator
self.denominator = newdenominator
# because every fraction is described by these two things
def add(self, other):
newdenominator = self.denominator * other.denominator
newnumerator = self.numerator * other.denominator + self.denominator * other.numerator
return MyFraction(newnumerator, newdenominator)
정수보다 분수가 더 많습니다 (실제로는 아니지만 컴퓨터는 그것을 모릅니다). 두 가지를 만들어 보겠습니다.
half = MyFraction(1, 2)
third = MyFraction(1, 3)
five_sixths = half.add(third)
print five_sixths.numerator
# ==> 5
print five_sixths.denominator
# ==> 6
당신은 실제로 여기에서 아무것도 선언하지 않습니다. 속성은 새로운 종류의 변수와 같습니다. 정규 변수에는 하나의 값만 있습니다. 당신이 씁니다 colour = "grey"
. 당신은라는 이름의 또 다른 변수가 가질 수 없습니다 colour
입니다 "fuchsia"
하지 코드에 같은 장소에를 -.
배열은 그것을 어느 정도 해결합니다. 라고 말하면 colour = ["grey", "fuchsia"]
두 색상을 변수에 쌓았지만 위치 (이 경우 0 또는 1)로 구분합니다.
속성은 개체에 바인딩 된 변수입니다. 배열과 마찬가지로 우리는 다양한 개에 대해 많은 colour
변수를 가질 수 있습니다 . 그래서, 하나의 변수이지만 다른 것입니다. 첫 번째는 변수 내의 객체에 바인딩됩니다 . 두 번째, . 전화 할 때 지금 , 나 항상 매개 변수 목록의 전면에 매달려 여분의 하나에 할당됩니다 눈에 보이지 않는 매개 변수가있을 것입니다. 일반적으로라고 하며 점 앞에있는 개체의 값을 가져옵니다. 따라서 Dog 's (생성자) 내에는 새로운 Dog가 무엇이든 될 것입니다. 내 S ' , 변수의 개체에 바인딩됩니다 . 그러므로,fido.colour
spot.colour
fido
spot
Dog(4, "brown")
three.add(five)
self
__init__
self
MyInteger
add
self
three
three.value
에서 add
와 같이 외부에서 동일한 변수 self.value
가 add
됩니다.
내가이라고 말하면 the_mangy_one = fido
, 나는 fido
또 다른 이름 으로 알려진 물체를 언급하기 시작할 것 입니다. 지금부터 fido.colour
정확히 같은 변수입니다 the_mangy_one.colour
.
따라서 __init__
. 개의 출생 증명서에 주목하는 것으로 생각할 수 있습니다. colour
그 자체로 임의의 변수이며 어떤 것도 포함 할 수 있습니다. fido.colour
또는 self.colour
Dog의 ID 시트의 양식 필드와 같습니다. 그리고 __init__
처음으로 그것을 작성하는 점원입니다.
더 명확합니까?
편집 : 아래 댓글에 확장 :
당신은 물건 의 목록을 의미 하지 않습니까?
우선, fido
실제로는 객체가 아닙니다. 그것은 현재 당신이 말할 때와 같은 개체를 포함하는 변수이며 x = 5
, x
현재 5 번을 포함하는 변수입니다. 나중에 마음이 바뀌면 할 수 있으며 fido = Cat(4, "pleasing")
(클래스를 생성 한 경우 Cat
) fido
그때부터 고양이 개체를 "포함"합니다. 를 사용하면 fido = x
동물 개체가 아닌 숫자 5가 포함됩니다.
클래스 자체는 인스턴스를 추적하기 위해 특별히 코드를 작성하지 않는 한 인스턴스를 알지 못합니다. 예를 들면 :
class Cat:
census = [] #define census array
def __init__(self, legs, colour):
self.colour = colour
self.legs = legs
Cat.census.append(self)
여기 census
에 Cat
class 의 클래스 수준 속성이 있습니다.
fluffy = Cat(4, "white")
spark = Cat(4, "fiery")
Cat.census
# ==> [<__main__.Cat instance at 0x108982cb0>, <__main__.Cat instance at 0x108982e18>]
# or something like that
당신은 얻을 수 없습니다 [fluffy, sparky]
. 그것들은 단지 변수 이름입니다. 고양이 자체에 이름을 지정하려면 이름에 대해 별도의 속성을 만든 다음 __str__
이 이름을 반환 하도록 메서드를 재정의해야합니다 . 이 메서드 (즉, add
또는 같은 클래스 바인딩 함수 __init__
)의 목적은 출력 할 때와 같이 객체를 문자열로 변환하는 방법을 설명하는 것입니다.