2013-07-30 10 views
1

파생 클래스에서 기본 클래스의 멤버를 재정의하여 해당 멤버에 액세스하면 파생 멤버가 호출되도록하는 방법? 다음 예를 고려해보십시오. __tmpB에 덮어 쓰기 및 난독 변수 이름을 사용하지 마십시오 tmp()Python : 파생 클래스의 기본 클래스 멤버를 숨기기

class A: 
    __tmp = {"A" : 1, 
      "B" : 2} 
    def tmp(self): 
     return self.__tmp 

class B(A): 
    __tmp = {"A" : 10, 
      "B" : 20} 
    def __init__(self): 
     super().__init__() 

b = B() 
print(b.tmp()) # Expect to print {'A': 10, 'B': 20} here 

답변

3

를 호출의 경우에 반환해야합니다

class A: 
    _tmp = {"A" : 1, 
      "B" : 2} 
    def tmp(self): 
     return self._tmp 

class B(A): 
    _tmp = {"A" : 10, 
      "B" : 20} 
    def __init__(self): 
     super().__init__() 

b = B() 
print(b.tmp()) # Works as expected 

문제는 self.__tmp 이름-엉망이 장면 뒤에이었다을 tmpA 클래스의 메소드이기 때문에 파이썬으로 인해 self._A__tmp으로 해석됩니다. 당신은 self._B__tmp을 원했습니다. tmp 메서드를 B에서 재정의 한 경우 효과가 있었지만 상속의 목적 중 하나 인 코드 중복을 피할 수 있기 때문에 바보 같은 방식이었습니다.

준비 제도 이사회는 서브 클래스의 속성과 이름 충돌을 피하기 하고자하는 경우에 대한 __private 변수의 사용. 이 경우 실제로는 과 같은 이름 지정 충돌이 발생하기를 원합니다.

속성을 비공개로 설정하려는 경우 we're all consenting adults here부터 하나의 밑줄만으로도 충분합니다.

+0

감사합니다. '난독 화 된 변수 이름'이란 정확히 무엇을 의미합니까? 이중 밑줄인가, 아니면이 예제의'tmp'인가? – Razer

+1

속성에 두 개의 밑줄을 사용하면 이름이 뒤섞이는 원인이됩니다. 이것은 [pep-8] (http://www.python.org/dev/peps/pep-0008/)에서 자세히 설명합니다 ("밑줄 문자"로 검색). –

0

설명에서 내게 명확하지 않은 이유는 왜 원했고 이해해야합니다. 다소 이상한 디자인처럼 보입니다. 그럼에도 불구하고, getter를 그냥 덮어 쓰는게 어떨까요?

class A(object): 
    __tmp = {"A" : 1, 
      "B" : 2} 
    def tmp(self): 
     return self.__tmp 

class B(A): 
    __tmp = {"A" : 10, 
      "B" : 20} 
    def __init__(self): 
     super(B, self).__init__() 

    def tmp(self): 
     return B.__tmp 


b = B() 
print(b.tmp()) # Expect to print {'A': 10, 'B': 20} here 
+0

두 가지 모두를 구현하는 것은 의미가 없습니다. 불필요한 작업 일뿐입니다. 이 디자인의 목표는 몇 가지 이름 ('__tmp')을 제공하는 기본 클래스 'A'를 갖는 것입니다. 서브 클래스는 자신의 이름을 정의하거나 기본 클래스의 이름을 허용 할 수 있습니다. 그럼에도 불구하고이 액세스 권한은 올바른 액세스 권한을 반환해야합니다. – Razer

관련 문제