2016-11-30 1 views
2

속성이 변경 될 때마다 데이터의 유효성을 검사하려는 클래스가 있습니다. setter가 참조 할 수있는 클래스 변수로 유효한 옵션을 저장하고 싶지만 @var.setter 옵션에서 나는 이라는 클래스 변수를 전혀 참조 할 수 없습니다.입니다.@ var.setter 함수가 클래스 변수에 액세스 할 수없는 이유는 무엇입니까?

왜 그럴까요?

코드 예제 :

class Standard(): 
    def __init__(self): 
     self.variable1 = 1 
     self.variable2 = 2 

    @property 
    def variable1(self): 
     # This works 
     print(self.variable2) 
     return self.__variable1 

    @variable1.setter 
    def variable1(self, var): 
     # This doesn't work 
     print(self.variable2) 
     self.__variable1 = var 

x = Standard() 
print(x.variable1) 
x.variable1 = 4 
print(x.variable1) 

이 출력 :

AttributeError: 'Standard' object has no attribute 'variable2' 

이 명확하지 않습니다.

+1

'self.variable2'은 아직 e가 아닙니다. 'self.variable1'에 할당 할 때 xist. – vaultah

+0

의도적으로'__init__'에'self.variable1'을 설정합니까? 아니면'self .__ variable1'을 의미합니까? –

답변

4

당신은 __init__variable1을 설정 첫번째 있습니다 self.variable1 이후

def __init__(self): 
    self.variable1 = 1 
    self.variable2 = 2 

@variable1.setter에 의해 처리됩니다, variable2 아직 그 시간에 존재할 수 없습니다. 당신은 할 수 스왑 두 줄 :

def __init__(self): 
    self.variable2 = 2 
    self.variable1 = 1 

는 이제 variable2가 제대로 variable1.setter이 실행되기 전에 설정됩니다.

또는 variable2에게 기본 역할을하는 클래스 속성 제공 :

class Standard(): 
    # ... 

    variable2 = 'class default' 

    @variable1.setter 
    def variable1(self, var): 
     print(self.variable2) 
     self.__variable1 = var 

또는 사용을 getattr()self에 :

@variable1.setter 
def variable1(self, var): 
    print(getattr(self, 'variable2', 'not available yet')) 
    self.__variable1 = var 

또는 세터 거치지 않고 직접 __variable1을 설정

class Standard(): 
    def __init__(self): 
     self.__variable1 = 1 # don't use the setter 
     self.variable2 = 2 
+0

와우, 나 한테 너무 많이 가르쳐 줬어! 고맙습니다! – Mallow

관련 문제