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)
写:
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)
想一想:什么是超级Dog?Animal对于这个案例,这个问题的答案是正确的.但是如果你使用多重继承,这可能会有所不同.
如果您使用Python 3,所有事情都会变得更简单:
class Dog(Animal):
def __init__(self, genus):
super().__init__(genus)
Run Code Online (Sandbox Code Playgroud)
作品.犯错的表面要少得多.
如果您需要使用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.使用它,允许您在Python 2中编写Python 3(至少对于所有重要的更改).