python 继承类中的 __init__ 方法

25 投票
6 回答
39313 浏览
提问于 2025-04-16 15:34

我想给一个子类添加一些额外的属性,但不想明确地调用一个新的方法。那么,有没有办法给继承的类一个类似于__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 个回答

6

首先,你把 __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__()
17

只需要用 super 来调用父类的 __init__ 方法:

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

我强烈建议遵循Python的命名规则,类名要用大写字母开头,比如 InheritedClassInitialClass。这样可以很快区分出类和方法、变量。

39

据我所知,这是不可能的。不过,你可以像这样调用父类的初始化方法:

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

撰写回答