簡體   English   中英

繼承類中的python __init__方法

[英]python __init__ method in inherited class

我想為子類提供一些額外的屬性,而不必顯式調用新方法。 那么有沒有辦法給繼承的類一個__init__類型的方法,它不會覆蓋父類的__init__方法?

我編寫下面的代碼純粹是為了說明我的問題(因此屬性命名不當等)。

class initialclass():
    def __init__(self):
        self.attr1 = 'one'
        self.attr2 = 'two'    

class inheritedclass(initialclass):
    def __new__(self):
        self.attr3 = 'three'

    def somemethod(self):
        print 'the method'


a = inheritedclass()

for each in a.__dict__:
    print each

#I would like the output to be:
attr1
attr2
attr3

謝謝

據我所知這是不可能的,但是您可以調用超類的 init 方法,如下所示:

class inheritedclass(initialclass):
    def __init__(self):
        initialclass.__init__(self)
        self.attr3 = 'three'

只需使用super調用父母的__init__

class inheritedclass(initialclass):
    def __new__(self):
        self.attr3 = 'three'
        super(initialclass, self).__init__()

我強烈建議遵循 Python 的命名約定並以大寫字母開頭一個類,例如InheritedClassInitialClass 這有助於快速區分類與方法和變量。

首先,您正在混合__init____new__ ,它們是不同的東西 __new__不接受實例( self )作為參數,它接受類( cls )。 至於你的問題的主要部分,你需要做的是使用super來調用超類' __init__

您的代碼應如下所示:

class initialclass(object):
    def __init__(self):
        self.attr1 = 'one'
        self.attr2 = 'two'    

class inheritedclass(initialclass):
    def __init__(self):
        self.attr3 = 'three'
        super(inheritedclass, self).__init__()

這非常簡單。 定義一個新的__init__方法並在開始時調用父級的__init__

# assuming a class Base, its __init__ takes one parameter x

class Derived(Base):
    def __init__(self, x, y):
        # whatever initialization is needed so we can say Derived is-a Base
        super(Derived, self).__init__(x)
        # now, add whatever makes Derived special - do your own initialization
        self.y = y

在 Python 3 中,您不必(因此為了簡單起見可能不應該)顯式繼承object或將 class 和self傳遞給super

只需從父級的 init 調用指定的方法(如果存在):

class initialclass():
    def __init__(self):
        self.attr1 = 'one'
        self.attr2 = 'two'  
        if hasattr(self, 'init_subclass'):
            self.init_subclass()

class inheritedclass(initialclass):
    def init_subclass(self):
        self.attr3 = 'three'
class initialclass:
        def __init__(self):
                self.attr1 = 'one'
                self.attr2 = 'two'
class inheritedclass(initialclass):
        def __init__(self):
                super().__init__()
                self.attr3 = 'three'
        def somemethod(self):
                print (self.attr1, self.attr2, self.attr3)
a=inheritedclass()
a.somemethod()

 1. List item

暫無
暫無

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

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