2017-02-06 1 views
1
class Ant: 
    count = 0 

    def __init__(self): 
     if count == 0: 
      self.real = True 
     else: 
      self.real = False 
     count += 1 

그래서 기본적으로 달성하고자하는 것은이 클래스의 첫 번째 인스턴스 만 True이 될 실제 속성이고 False 인 후속 속성을 갖기를 원합니다. 지금 이것이 count에 대한 언 바운드 로컬 에러를 줄 것이라고 알고 있습니다. 이 작업을 어떻게 수행합니까?__init__에서 클래스 속성을 변경하는 방법은 무엇입니까?

+0

'count' in'__init__'는 단지 보통 지역 변수입니다. * 클래스 수준 변수 * –

답변

4

변경 countcount으로

Ant.count으로는 (개미 클래스의 모든 인스턴스간에 공유) 클래스 멤버이며 클래스 이름의 접두사로 사용한다 특정 인스턴스에 속해 있지 않습니다.

class Ant: 
    count = 0 

    def __init__(self): 
     if Ant.count == 0: 
      self.real = True 
     else: 
      self.real = False 
     Ant.count += 1 
+0

'self.count'에 액세스하려면'Ant.count'가 필요합니다. 클래스의 이름을 함수에 하드 코딩하지 않아도됩니다. (따라서 classname이 변경되었습니다). – martineau

+2

@martineau 아니요, self.count는 인스턴스 변수가 될 것입니다. OP가 원하는 것만 큼 명확하지 않습니다. 클래스 변수가 필요하기 때문에 Ant.count는이를 참조하는 올바른 방법 일 수 있습니다. – barny

+1

죄송합니다. 네, 맞습니다.'self'는 클래스 변수 값을 변경하기위한 것이 아니라, 인스턴스 변수를 부작용으로 생성하고 (나중에 클래스 속성을 숨기는) 클래스 변수 값을 읽는 데만 작용합니다. 즉, 그 자리에'self .__ class__'를 사용하여 코드의 모든 곳에서 클래스 이름을 하드 코딩하는 것을 피할 수 있습니다. 너무 길면'cls = self .__ class__' 메소드를 사용하여 지역 변수를 생성하고 그 대신에 사용할 수 있습니다. – martineau

1

self.__class__.variable을 사용 안함 - 같은 변수가 모든 서브 클래스에 의해 공유하지 않으려면. 이 같은 코드에서

:

class Ant: 
    count = 0 

은 "카운트"값은 '클래스에 __dict__ 속성에 저장됩니다. 당신은 같은 것을 할 경우 : 인스턴스 "자기"의 count의 어떤 인스턴스가없는보고, 그 클래스의 값을 검색합니다 파이썬의 데이터 모델에 정의 된

class Ant: 
    count = 0 
    def __init__(self): 
     print(self.count) 

attrobute 액세스 메커니즘을. 따라서 이 클래스 변수의 값인을 읽으면 정상적인 인스턴스로 사용할 수 있습니다. 코드가 같이가는 경우

그러나 : 어떻게됩니까

def __init__(self): 
    self.count += 1 

는 전체 다른 것들을 인 : 파이썬 는 위 클래스의 속성은, 여기에 1을 추가를 읽어 들여, 새로운 결과에 저장 인스턴스.

그래서, 당신은 클래스 값에 액세스 할 때마다, 당신이 중 하나를 수행 할 수 있습니다 하드 코드 클래스 이름은 - (메소드 코드가 실행될 때 이후로, 클래스가 이미 생성되어 "알려진"입니다) :

class Ant: 
    count = 0 
    def __init__(self): 
     Ant.count += 1 

또는 더 나은 아직, 인스턴스의 __class__ 속성 사용 - 위의 두 번째 예에서, 서브 클래스가 더 포함되어있는 경우처럼 항상 적절한 서브 클래스

class Ant: 
    count = 0 
    def __init__(self): 
     self.__class__.count += 1 

class FireAnt(Ant): 
    count = 0 

의 변수 값 (즉,을,주의를 얻을 것이다 그런 식으로 자신의 count 변수, 값 수퍼 클래스 'count이 읽히고,이 코드가 처음 실행될 때 서브 클래스에 새로운 것이 생성 될 것입니다.)

관련 문제