继承类中的python __init__方法

Ana*_*ake 19 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
Run Code Online (Sandbox Code Playgroud)

谢谢

Yex*_*exo 33

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

class inheritedclass(initialclass):
    def __init__(self):
        initialclass.__init__(self)
        self.attr3 = 'three'
Run Code Online (Sandbox Code Playgroud)

  • 辉煌,我一直试图找出处理这种情况的好方法一段时间 (2认同)

Ada*_*tan 16

只需__init__使用super以下方法调用父级:

class inheritedclass(initialclass):
    def __new__(self):
        self.attr3 = 'three'
        super(initialclass, self).__init__()
Run Code Online (Sandbox Code Playgroud)

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

  • 具体来说,使用`super(DerivingClass,self).__ init __()`.或者只是Python中的`super().__ init __()`3.编辑:-1因为1.`super`需要继承(!)类和2.你不必要地覆盖`__new__`,而现在的代码是事实不正确(它创建了一个**类**属性`attr3`). (2认同)

var*_*tec 5

首先你混合__init____new__,他们是不同的东西.__new__不将instance(self)作为参数,它需要class(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__()
Run Code Online (Sandbox Code Playgroud)