2013-10-15 2 views
0

@classmethod으로 액세스 할 수있는 __flag 속성이있는 기본 클래스가 있다고 가정합니다.Python - 파생 클래스에서 클래스 속성 재정의

class Base(object): 
    __flag = None 

    def __init__(self) : 
     pass 

    @classmethod 
    def flag(self): 
     return self.__flag 

속성을 변경하는 파생 클래스가 있다고 가정합니다.

In [3]: print Derived.flag() 
None 

이유 : 내가 파생 된 클래스의 속성에 액세스하려고 할 때

class Derived(Base): 
    __flag = True 

그런 다음, 나는 기본 클래스의 속성을 얻을? 나는 정말로 이해할 수 없다.

답변

2

____flag에서 제거하면 제대로 작동합니다. 그래서 같이 : 제공

class Base(object): 
    flagAtt = None 

    def __init__(self) : 
     pass 

    @classmethod 
    def flag(self): 
     return self.flagAtt 

class Derived(Base): 
    flagAtt = True 

: 파이썬에서 "숨겨진"변수가 다르게 저장 얻을 때문에

>>> print Derived.flag() 
True 
>>> print Base.flag() 
None 
+0

오, 그렇게 간단합니다! 고마워요! –

+0

걱정 마세요 :) –

3

이입니다. 거기에 약간의 마법이 있습니다.

class Base(object): 
    __flag = 'base' 
    _other_flag = 'base' 

    def __init__(self) : 
     pass 

    @classmethod 
    def flag(self): 
     return self.__flag 

    @classmethod 
    def other_flag(self): 
     return self._other_flag 

class Derived(Base): 
    __flag = 'derived' 
    _other_flag = 'derived' 

print 'base flag', Base.flag() 
print 'derived flag', Derived.flag() 
print 'base other flag', Base.other_flag() 
print 'derived other flag', Derived.other_flag() 

# Note the following 2 statements: 
print 'base flag property', Derived._Base__flag 
print 'derived flag property', Derived._Derived__flag 

print 'base other flag property', Base._other_flag 
print 'derived other flag property', Derived._other_flag 

당신이 아래에 볼 수 있듯이

는, 그것이 Base.flag 메소드 내 것과 다른 변수에 저장하고 자동으로 번역 된 것 :

여기 그것이 작동하지 않는 이유의 예입니다.

1

파이썬 때문에 Base__flag__flag가 다르다 (는 두 밑줄 단부를 제외한) 두 밑줄로 시작하는 변수에 대한 네임 맹 글링을 행한다. 당신은 dir를 사용하여이 작업을 관찰 할 수있다 :

>>> class Base(object): 
...  __flag = True 
... 
>>> dir(Base) 
['_Base__flag', '__class__', '__delattr__', ...... # lots of others 

__flag 변수는 여기 _Base__flag으로 설정되어 있습니다. Derived에서는 _Derived__flag으로 바뀌므로 실제로 새 변수를 추가하는 대신 아무 것도 재정의하지 않습니다.

변수를 재정의하려면 이 아니고은 2 개의 밑줄로 시작하는 사용 이름을 사용하십시오.

관련 문제