簡體   English   中英

類的所有子類中的字段

[英]Fields in all subclasses of a class

假設我們有一個A類,一個繼承自A B類,以及繼承自B CDE類。

我們希望所有這些類有一個屬性_f用默認值初始化,我們希望該屬性是可變的,並具有類的每個實例都有一個單獨的值,也就是說,它不應該是一個靜態的,恆定值A由所有子類使用。

一種方法是在A的__init__方法中定義_f ,然后在子類中依賴這個方法:

class A:
    def __init__(self):
        self._f = 'default_value'

class B(A):
    def __init__(self):
        super(B, self).__init__()

class C(B):
    def __init__(self):
        super(C, self).__init__()

是否有任何好的Pythonic方法可以避免這種情況,並且可能避免使用元類?

如果你的目標是通過消除調用基類構造函數來簡化子類構造函數,但仍然能夠覆蓋子類中的默認值,那么就有一個共同的范例,即利用Python將為屬性返回類的值的事實。它在實例上不存在。

使用稍微更具體的例子,而不是......

class Human(object):

    def __init__(self):
        self._fingers = 10

    def __repr__(self):
        return 'I am a %s with %d fingers' % (self.__class__.__name__, self._fingers)


class MutatedHuman(Human):

    def __init__(self, fingers):
        super(MutatedHuman, self).__init__()
        self._fingers = fingers


print MutatedHuman(fingers=11)
print Human()

...您可以使用...

class Human(object):

    _fingers = 10

    def __repr__(self):
        return 'I am a %s with %d fingers' % (self.__class__.__name__, self._fingers)


class MutatedHuman(Human):

    def __init__(self, fingers):
        self._fingers = fingers


print MutatedHuman(fingers=11)
print Human()

......兩者都輸出......

I am a MutatedHuman with 11 fingers
I am a Human with 10 fingers

重要的一點是,第二個示例中的self._fingers = fingers行不會覆蓋類Human上設置的默認值,而只是在引用為self._fingers時隱藏它。

當變量引用可變類型(例如列表)時,它有點毛茸茸。 您必須小心不要對將修改它的默認值執行操作,盡管執行self.name = value仍然是安全的。

這種方法的優點是它傾向於導致比其他方法更少的代碼行,這通常是一件好事(tm)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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