[英]Python: Hide member of base class in derived class
如何覆蓋派生類中的基類成員,以便訪問此類成員導致調用派生成員? 考慮下面的例子? __tmp
在B
被覆蓋,如果調用tmp()
應該返回
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
不要使用模糊變量名稱:
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
因為tmp
是A
類的一種方法。 你想要self._B__tmp
。 如果你已經重新定義了B
的tmp
方法,那么它會起作用,但這是一種愚蠢的方式,因為它破壞了繼承的目的之一 - 避免代碼重復。
當您希望避免與子類的屬性發生名稱沖突時,請保留__private
變量的使用。 在這種情況下,你真的希望才達到這樣的命名collition。
如果你想把一個屬性設為私有,只需要一個下划線,因為我們都在這里同意成年人 。
從描述中我不清楚,為什么應該被通緝並且應該有意義。 看起來像一個相當奇怪的設計。 但是,你為什么不覆蓋吸氣劑呢?
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.