【问题标题】:How to initialize subclass parameters in python using super()如何使用 super() 在 python 中初始化子类参数
【发布时间】:2015-12-31 18:38:58
【问题描述】:

我在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

【问题讨论】:

  • super 的重点是你总是使用 current 类。

标签: python inheritance super


【解决方案1】:

修复

写:

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

如果你使用 Python 3,一切都会变得更简单:

class Dog(Animal):

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

有效。犯错误的表面要少得多。

Python 2 与 Python-Future 中的 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(至少对于所有重要更改)。

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多