2013-11-03 6 views
3

Python - why use "self" in a class? 과 같은 스택 응답에 대해 이미 많은 답변을 읽었습니다. 클래스 변수가 모든 인스턴스에서 공유되는 동안 인스턴스 변수가 클래스의 각 인스턴스마다 고유하다는 것을 알았습니다.클래스 변수와 인스턴스 변수의 차이점

class A: 
    x = [] 
    def add(self): 
     self.x.append(1) 

x = A() 
y = A() 
x.add() 
print "Y's x:",y.x 

출력 [1]을 줄 않습니다 - 주위 재생하는 동안 나는이 코드는 것을 발견했다. 그러나,이 코드 - 내 의견으로는 11을해야 할 때

class A: 
    x = 10 
    def add(self): 
     self.x += 1 

x = A() 
y = A() 
x.add() 

print "Y's x:",y.x 

10로 출력을 제공합니다. 이것이 아주 멍청한 질문이라면 용서해주십시오. 프로그래밍에 경험이별로 없습니다.

+0

덕분에 @mbatchkarov, 내가 그 슬립 : – MayankJain

답변

9

클래스 변수는 이고 인스턴스 속성으로는입니다. 즉, 속성을 찾을 때, 파이썬은 먼저 인스턴스를 찾은 다음 클래스를 찾습니다. 또한 객체에 변수 (예 : self)를 설정하면 인스턴스 변수가 항상 생성되므로 클래스 변수가 변경되지 않습니다. 파이썬은 무엇

self.x = self.x + 1 

은 다음과 같습니다에

입니다
self.x += 1 

동등한 (이 경우, 각주 참조)

당신이 할 때, 당신의 예에서 것을 의미한다 :

  1. 찾아보기 self.x. 이 시점에서 self에는 인스턴스 속성 x이 없으므로 값이 10A.x 클래스 속성이 있습니다.
  2. RHS를 계산하면 결과는 11이됩니다.
  3. 이 결과는 x의 새 인스턴스 특성 인 self에 할당됩니다. 그래서 아래

, 당신은 x.x을 볼 때, 당신은 add()에서 만든이 새로운 인스턴스 속성을 얻을. y.x을 찾을 때, 여전히 class 속성을 얻습니다. 클래스 속성을 변경하려면 명시 적으로 A.x += 1을 사용해야합니다. 조회는 속성 값을 읽을 때만 발생합니다.


귀하의 예는 고전 잡았다과 인스턴스 속성에 대해 당신이 클래스를 사용하지 말아야하는 이유는 "기본"값으로 속성. 전화 할 때 :

self.x.append(1) 

self.x에 대한 지정이 없습니다. 따라서 변경 가능한 객체의 내용을 list과 같이 변경할 수 없습니다. 따라서 새 인스턴스 속성이 섀도 잉되는 x에 추가되지 않으며 나중에 x.xy.x을 조회하면 동일한 결과를 얻을 수 있습니다 클래스 속성의 목록.


참고 : 파이썬에서x += y 항상 x = x + y에 해당하지 않습니다. 파이썬에서는 유형에 맞는 일반 연산자와는 별도로 적절한 연산자를 재정의 할 수 있습니다. 대체로 가변적 인 개체의 경우 해당 위치 버전이 의 내용을 직접 변경하여 대신 표현의 LHS를 재 할당하는 것이 좋습니다. 그러나 immutable 개체 (예 : 두 번째 예제의 숫자)는 내부 연산자를 재정의하지 않습니다. 이 경우, 진술은 정기적 인 추가 및 재 할당으로 평가되어 사용자가 보는 동작을 설명합니다.

(나는 this SO answer에서 위의 해제, 자세한 내용은이 참조하십시오.)

+0

다양한 설명을하도록하는 방법을 모르겠어요! – aIKid

+0

사실,'x + = ...'는 항상'x = x + ...'와 같지 않습니다. self.x.append (1) 대신에'self.x + = [1]'을 사용하기 위해 list class 변수를 사용하여 코드를 변경하면 관찰 할 수 있습니다. – delnan

+0

'x + = y'는'x = x + y'와 대체로 비슷합니다. '__iadd__'와'__add__'는 다릅니다. – DSM

관련 문제