我想知道这个问题已经有一段时间了,我希望这不是一个愚蠢的问题,我没有意识到一个明显的答案:为什么我不能把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相关问答推荐

Odoo 14 hr. emergency.public内的二进制字段

比较2 PD.数组的令人惊讶的结果

如何获取TFIDF Transformer中的值?

在Mac上安装ipython

try 将一行连接到Tensorflow中的矩阵

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

运输问题分支定界法&

形状弃用警告与组合多边形和多边形如何解决

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

改进大型数据集的框架性能

如何在TensorFlow中分类多个类

matplotlib图中的复杂箭头形状

如何检测鼠标/键盘的空闲时间,而不是其他输入设备?

pandas fill和bfill基于另一列中的条件

统计numpy. ndarray中的项目列表出现次数的最快方法

jsonschema日期格式

Autocad使用pyautocad/comtypes将对象从一个图形复制到另一个图形

从列表中分离数据的最佳方式

PyTorch变压器编码器中的填充掩码问题

判断字典键、值对是否满足用户定义的搜索条件