Python:在需要参数时使用 super() 调用基类的 __init__() 方法

标签 python inheritance super

<分区>

我正在尝试调用 __init__()父类(super class)中的方法,其中所述方法采用参数,但它似乎不起作用。请看下面的代码:

>>> class A:
        def __init__(self, param1, param2):
            self._var1 = param1
            self._var2 = param2

>>> class B(A):
        def __init__(self, param1, param2, param3):
            super(B, self).__init__(param1, param2)
            self._var3 = param3


>>> a = A("Hi", "Bob")
>>> a._var1
'Hi'
>>> a._var2
'Bob'
>>> 
>>> b = B("Hello", "There", "Bob")

Traceback (most recent call last):
  File "<pyshell#74>", line 1, in <module>
    b = B("Hello", "There", "Bob")
  File "<pyshell#69>", line 3, in __init__
    super(B, self).__init__(param1, param2)
TypeError: must be type, not classobj
>>>

我从来没有能够让它工作。我究竟做错了什么?理想情况下,我想使用 super()A.__init__(self, <parameters>) ,如果这是可能的(它必须是)。

最佳答案

根据经验:在 Python 2 中,您的基类应始终从 object 继承,否则您将使用具有与您所描述的令人惊讶的行为的旧式类。

那么试试

class A(object):
    ...

像这样:

In [1]: class A(object):
   ...:     def __init__(self, param1, param2):
   ...:         self._var1 = param1
   ...:         self._var2 = param2
   ...:

In [2]: class B(A):
   ...:     def __init__(self, param1, param2, param3):
   ...:         super(B, self).__init__(param1, param2)
   ...:         self._var3 = param3
   ...:

In [3]: a = A("Hi", "Bob")

In [4]: a._var1
Out[4]: 'Hi'

In [5]: a._var2
Out[5]: 'Bob'

In [6]: b = B("Hello", "There", "Bob")

In [7]: b._var3
Out[7]: 'Bob'

如果您真的知道自己在做什么(至少请参阅 the docsthis)并且您想要使用旧式类,则不能使用 super(),但是而是需要像这样从子类中手动调用父类(super class)的 __init__:

class A:
    ...

class B(A):
    def __init__(self, p1, p2, p3):
        A.__init__(p1, p2)
        ...

关于Python:在需要参数时使用 super() 调用基类的 __init__() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30077130/

相关文章:

类和子类中的 C++ 成员函数指针

Java 用对象的父类(super class)类型保存对象

javascript - 如何调用同名的父函数?

python - 如何使用 super 命令python

python - 为什么 PyTorch 自定义模块中需要 super 构造函数?

python - 如何自动选择和处理/root/facedetect 目录中的每个图像而不是选择特定图像

python - 在 Python 中存储和重新加载大型多维数据集

python - Pytest 在派生类中生成测试

python - 我需要将邮政编码更改为一系列点和破折号(条形码),但我不知道如何

python - 使用查询从 DynamoDB 检索所有项目?