继承类中的python __init__方法

时间:2011-04-12 13:58:48

标签: python oop inheritance

我想给一个子类一些额外的属性,而不必显式调用一个新方法。那么有没有一种方法可以为继承的类提供__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

谢谢

6 个答案:

答案 0 :(得分:33)

据我所知,这是不可能的,但你可以调用超类的init方法,如下所示:

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

答案 1 :(得分:16)

只需使用__init__

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

我强烈建议遵循Python的命名约定,并使用大写字母开始一个类,例如InheritedClassInitialClass。这有助于快速区分类与方法和变量。

答案 2 :(得分:5)

首先,您要混合__init____new__,它们是different things__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__()

答案 3 :(得分:3)

这非常简单。定义新的__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或将类self传递给super。< / p>

答案 4 :(得分:0)

只需从父进程调用指定的方法(如果存在):

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'

答案 5 :(得分:0)

'stream' => [
        'ssl' => [
           'allow_self_signed' => true,
           'verify_peer' => false,
           'verify_peer_name' => false,
        ],
     ],