클래스 변수는 이고 인스턴스 속성으로는입니다. 즉, 속성을 찾을 때, 파이썬은 먼저 인스턴스를 찾은 다음 클래스를 찾습니다. 또한 객체에 변수 (예 : self
)를 설정하면 인스턴스 변수가 항상 생성되므로 클래스 변수가 변경되지 않습니다. 파이썬은 무엇
self.x = self.x + 1
은 다음과 같습니다에
입니다
self.x += 1
동등한 (이 경우, 각주 참조)
이
당신이 할 때, 당신의
초 예에서 것을 의미한다 :
- 찾아보기
self.x
. 이 시점에서 self
에는 인스턴스 속성 x
이 없으므로 값이 10
인 A.x
클래스 속성이 있습니다.
- RHS를 계산하면 결과는
11
이됩니다.
- 이 결과는
x
의 새 인스턴스 특성 인 self
에 할당됩니다. 그래서 아래
, 당신은 x.x
을 볼 때, 당신은 add()
에서 만든이 새로운 인스턴스 속성을 얻을. y.x
을 찾을 때, 여전히 class 속성을 얻습니다. 클래스 속성을 변경하려면 명시 적으로 A.x += 1
을 사용해야합니다. 조회는 속성 값을 읽을 때만 발생합니다.
귀하의 첫 예는 고전 잡았다과 인스턴스 속성에 대해 당신이 클래스를 사용하지 말아야하는 이유는 "기본"값으로 속성. 전화 할 때 :
self.x.append(1)
self.x
에 대한 지정이 없습니다. 따라서 변경 가능한 객체의 내용을 list
과 같이 변경할 수 없습니다. 따라서 새 인스턴스 속성이 섀도 잉되는 x
에 추가되지 않으며 나중에 x.x
및 y.x
을 조회하면 동일한 결과를 얻을 수 있습니다 클래스 속성의 목록.
참고 : 파이썬에서는 x += y
항상 x = x + y
에 해당하지 않습니다. 파이썬에서는 유형에 맞는 일반 연산자와는 별도로 적절한 연산자를 재정의 할 수 있습니다. 대체로 가변적 인 개체의 경우 해당 위치 버전이 의 내용을 직접 변경하여 대신 표현의 LHS를 재 할당하는 것이 좋습니다. 그러나 immutable 개체 (예 : 두 번째 예제의 숫자)는 내부 연산자를 재정의하지 않습니다. 이 경우, 진술은 정기적 인 추가 및 재 할당으로 평가되어 사용자가 보는 동작을 설명합니다.
(나는
this SO answer에서 위의 해제, 자세한 내용은이 참조하십시오.)
덕분에 @mbatchkarov, 내가 그 슬립 : – MayankJain