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

Malonge

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

这是基类:

class Animal(object):

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

现在这里不使用超级:

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
迈克·米勒

解决方法

写:

class Dog(Animal):

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

所以代替:

super(Animal, self).__init__(genus)

使用:

super(Dog, self).__init__(genus)

想一想:什么是超类DogAnimal对于这种情况,将是对此问题的正确答案。但是,如果您使用多重继承,则可能会有所不同。

Python 3进行救援

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

class Dog(Animal):

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

作品。少犯错误的表面。

带有Python-Future的Python 2中的Python 3优点

如果您需要使用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(至少对于所有重要更改)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章