我想知道这个问题已经有一段时间了,我希望这不是一个愚蠢的问题,我没有意识到一个明显的答案:为什么我不能把super()__init__方法称为super()()?我必须这样调用这个方法:super().__init__()

下面是一个示例,当我运行它时,得到了一个TypeError: 'super' object is not callable错误(特别是在__init__中第3行的第6行):

class My_Int(int):
    def __init__(self,value,extr_data=None):
        super()(value)
        self.extr_data=extr_data

x=My_Int(3)

super()不是继承了类int,使super()(value)int(value)相同吗?

此外,当从类list继承时,为什么不能将len函数与super()一起使用?len()__len__()不一样吗?

class My_List(list):
    def some_method1(self):
        print(len(super()))

    def some_method2(self):
        print(super().__len__())

x=My_List((1,2,3,4))

x.some_method2()
x.some_method1()

本例打印4,然后按预期显示一个错误.以下是准确的输出:

4
Traceback (most recent call last):
  File "/home/user/test.py", line 11, in <module>
    x.some_method1()
  File "/home/user/test.py", line 3, in some_method1
    print(len(super()))
TypeError: object of type 'super' has no len()

请注意,我在拨打some_method1之前先拨打了some_method2(很抱歉造成混淆).

我错过了什么明显的东西吗?

  • P、 谢谢你的帮助!

推荐答案

super()个对象无法拦截大多数特殊方法调用,因为它们绕过实例,直接在类型上查找方法,并且当其中许多方法不适用于任何给定用途时,它们不想实现所有特殊方法.这种情况更加奇怪,super()()会try 在super类型本身上查找__call__方法,并将super实例传递给它.

他们之所以不这样做,是因为它模棱两可,也不是特别明确.super()()是否意味着调用超类的__init__?是__call__吗?如果我们在__new__方法中,您是调用__new____init__还是两者都调用呢?这是否意味着所有super个用户都必须隐式知道调用它们的方法(甚至比知道定义它们的类和使用零参数构造时传递的self更神奇)?

为了避免在super上实现所有特殊方法,使其能够委托它们if,而不是处理所有这些问题,它们要求您显式指定要调用的特殊方法.

Python相关问答推荐

在 Python 中表示正方形上的数组元素(如图)

如何在 Python 中展平其中一列包含 json 对象的数据框?

为什么在赋值之前引用局部变量?

在最新版本的 PyTorch 中,让所有张量默认使用特定设备的最佳实践是什么?

Julia 可以将参数传递给内部匿名函数吗?

Python将字典插入数据库表的最简单方法?

PyQt5:如何使用 QtDBus 获取/设置属性

替换字符串内的不间断空格 \xa0

如何获取特定索引处的列名并使用 python 和 pandas 将其打印到另一列中

使用 assign 和作为参数传递的变量根据前一行更改列的值

使用类对象设置 Numpy 数组元素

为什么 MinMaxScaler 不改变数据集的 sns.pairplot?

在键值上匹配 2 个字典列表的最快方法

每 12 个值计算中位数

Matplotlib 将动画保存为视频,但内容为空

将到今年年底的剩余时间添加到今天的日期

是否可以在 PyTorch 中的 torch.nn.Sequential 中的 torch.nn.Flatten 之后自动调整层的后续输入?

是否有用于表示数据增量的标准算法或库?

使用 python 将 messagePack 解析为 Json

如何将 5 个数字映射到 5 种不同的 colored颜色