我在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
答案 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,所有事情都会变得更简单:
class Dog(Animal):
def __init__(self, genus):
super().__init__(genus)
的工作原理。犯错的表面要少得多。
如果您需要使用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(至少对于所有重要的更改)。