我已经看到了关于如何在python中使用'super'的各种示例,但在所有这些示例中,没有参数传递给子类的init方法.请考虑以下示例.
这是基类:
class Animal(object): def __init__(self, genus): self.genus = genus
现在heres没有使用超级:
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
那么如果对象.init()不带参数,如何在实例化那个子类时设置这个特定动物的特定属?我是否必须显式分配这样的变量:
class Dog(Animal): def __init__(self, genus): super(Animal, self).__init__() self.genus = genus
Mike Müller.. 8
写:
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(至少对于所有重要的更改).
写:
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(至少对于所有重要的更改).