簡體   English   中英

Python:隱藏派生類中基類的成員

[英]Python: Hide member of base class in derived class

如何覆蓋派生類中的基類成員,以便訪問此類成員導致調用派生成員? 考慮下面的例子? __tmpB被覆蓋,如果調用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因為tmpA類的一種方法。 你想要self._B__tmp 如果你已經重新定義了Btmp方法,那么它會起作用,但這是一種愚蠢的方式,因為它破壞了繼承的目的之一 - 避免代碼重復。

當您希望避免與子類的屬性發生名稱沖突時,請保留__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM