如何使用 super() 在 python 中初始化子类参数

How to initialize subclass parameters in python using super()

我在 How to use 'super' in python 上看过各种示例,但在所有这些示例中,都没有向 subclass' init 方法传递任何参数。考虑以下示例。

这里是基础class:

class Animal(object):

    def __init__(self, genus):
        self.genus = genus

现在不使用 super:

class Dog(Animal):

    def __init__(self, genus):
        Animal.__init__(self, genus)


x = Dog('Canis')
print x.genus  # Successfully prints "Canis"

现在当我改用 super 时:

class Dog(Animal):

    def __init__(self, genus):
        super(Animal, self).__init__(genus)

x = Dog('Canis')
print x.genus  

我收到以下错误:

TypeError: object.__init__() takes no parameters

那么如果 object.init() 没有参数,我如何在实例化那个 subclass 时设置这个特定动物的特定属?我是否必须像这样显式分配变量:

class Dog(Animal):

    def __init__(self, genus):
        super(Animal, self).__init__()
        self.genus = genus

修复

写:

class Dog(Animal):

    def __init__(self, genus):
        super(Dog, self).__init__(genus)

所以代替:

super(Animal, self).__init__(genus)

使用:

super(Dog, self).__init__(genus)

想想:Dog的超级class是什么?对于这种情况,Animal 将是该问题的正确答案。但是如果你使用多重继承,这可能会有所不同。

Python 3个救援

如果你使用Python 3,一切都会变得更简单:

class Dog(Animal):

    def __init__(self, genus):
        super().__init__(genus)

有效。犯错误的表面少得多。

Python Python 3 个细节 Python-Future

如果您需要使用 Python 2,请考虑 Python-Future。你可以在 Python 2:

上执行此操作
from builtins import object, super

class Animal(object):

    def __init__(self, genus):
        self.genus = genus

class Dog(Animal):

    def __init__(self, genus):
        super().__init__(genus)

x = Dog('Canis')
print(x.genus)  

这个builtins模块来自Python-Future。使用它,您可以在 Python 2 中编程 Python 3(至少对于所有重要更改)。