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

时间:2015-12-31 18:38:59

标签: python inheritance super

我在How to use 'super' in python上看到了各种例子,但在所有这些例子中,没有任何参数被传递给子类' init方法。请考虑以下示例。

这是基类:

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 ()没有参数,那么在实例化那个子类时如何设置这个特定动物的特定属?我是否必须明确分配这样的变量:

class Dog(Animal):

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

1 个答案:

答案 0 :(得分:7)

修复

写:

class Dog(Animal):

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

所以而不是:

super(Animal, self).__init__(genus)

使用:

super(Dog, self).__init__(genus)

想一想:Dog的超类是什么?对于这个案例,Animal将是这个问题的正确答案。但是如果你使用多重继承,这可能会有所不同。

Python 3用于救援

如果您使用Python 3,所有事情都会变得更简单:

class Dog(Animal):

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

的工作原理。犯错的表面要少得多。

Python 3中的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。使用它,允许您在Py​​thon 2中编写Python 3(至少对于所有重要的更改)。