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

Mal*_*nge 3 python inheritance super

我已经看到了关于如何在python中使用'super'的各种示例,但在所有这些示例中,没有参数传递给子类的init方法.请考虑以下示例.

这是基类:

class Animal(object):

    def __init__(self, genus):
        self.genus = genus
Run Code Online (Sandbox Code Playgroud)

现在heres没有使用超级:

class Dog(Animal):

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


x = Dog('Canis')
print x.genus  # Successfully prints "Canis"
Run Code Online (Sandbox Code Playgroud)

现在,当我使用super时:

class Dog(Animal):

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

x = Dog('Canis')
print x.genus  
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

TypeError: object.__init__() takes no parameters
Run Code Online (Sandbox Code Playgroud)

那么如果对象.init()不带参数,如何在实例化那个子类时设置这个特定动物的特定属?我是否必须显式分配这样的变量:

class Dog(Animal):

    def __init__(self, genus):
        super(Animal, self).__init__()
        self.genus = genus
Run Code Online (Sandbox Code Playgroud)

Mik*_*ler 8

修复

写:

class Dog(Animal):

    def __init__(self, genus):
        super(Dog, self).__init__(genus)
Run Code Online (Sandbox Code Playgroud)

所以代替:

super(Animal, self).__init__(genus)
Run Code Online (Sandbox Code Playgroud)

使用:

super(Dog, self).__init__(genus)
Run Code Online (Sandbox Code Playgroud)

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

Python 3用于救援

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

class Dog(Animal):

    def __init__(self, genus):
        super().__init__(genus)
Run Code Online (Sandbox Code Playgroud)

作品.犯错的表面要少得多.

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)  
Run Code Online (Sandbox Code Playgroud)

builtins模块来自Python-Future.使用它,允许您在Py​​thon 2中编写Python 3(至少对于所有重要的更改).