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

如何使用super()在python中初始化子类参数,python,inheritance,super,Python,Inheritance,Super,我在上看到了各种示例,但在所有这些示例中,都没有参数传递给子类的init方法。考虑下面的例子。 下面是基类: class Animal(object): def __init__(self, genus): self.genus = genus 现在,在不使用super的情况下: class Dog(Animal): def __init__(self, genus): Animal.__init__(self, genus) x = D

我在上看到了各种示例,但在所有这些示例中,都没有参数传递给子类的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
修复 写:

class Dog(Animal):

    def __init__(self, genus):
        super(Dog, self).__init__(genus)
因此,不是:

super(Animal, self).__init__(genus)
使用:

想一想:
狗的超类是什么
Animal
将是本案例中此问题的正确答案。但如果使用多重继承,则可能会有所不同

巨蟒3号用于救援 如果使用Python 3,所有事情都会变得更简单:

class Dog(Animal):

    def __init__(self, genus):
        super().__init__(genus)
工作。更不用说犯错误了

Python 2中的Python 3细节与Python未来

如果需要使用Python 2,请考虑。然后在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)  

这个
内置模块来自Python Future。使用它,您可以在Python2中编程Python3(至少对于所有重要的更改)

super
的要点是始终使用当前类。
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)