2013-07-30 110 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是名稱 - 錯位的幕後由python製作並解析爲self._A__tmp,因爲tmpA類的一種方法。你想要self._B__tmp。如果你已經在B中重新定義了tmp方法,它可能會奏效,但這是一種愚蠢的做法,因爲它違背了繼承的目的之一 - 避免代碼重複。

保留變量的使用__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

實施它們都沒有意義。這只是不必要的工作。這個設計的目標是有一個基類'A',它提供了一些名字('__tmp')。子類可以定義自己的名字或接受基類的名字。儘管如此,訪問它必須返回正確的。 – Razer

相關問題