Python 在tuple的子类中,`tuple.\\\\\\\\\`与`super().\\\\\\\\\\`有何不同?

Python 在tuple的子类中,`tuple.\\\\\\\\\`与`super().\\\\\\\\\\`有何不同?,python,Python,请参阅以下代码: #! /usr/bin/env python3 class MyTupleT(tuple): def __init__(self, contents): tuple.__init__(contents) self.len = len(contents) class MyTupleS(tuple): def __init__(self, contents): super().__init__(contents)

请参阅以下代码:

#! /usr/bin/env python3

class MyTupleT(tuple):
    def __init__(self, contents):
        tuple.__init__(contents)
        self.len = len(contents)

class MyTupleS(tuple):
    def __init__(self, contents):
        super().__init__(contents)
        self.len = len(contents)

t = MyTupleT([0, 1, 2])
print(t.len, t)

s = MyTupleS([0, 1, 2])
print(s.len, s)
输出为:

3 (0, 1, 2)
Traceback (most recent call last):
File "tuple_init.py", line 16, in <module>
    s = MyTupleS([0, 1, 2])
File "tuple_init.py", line 10, in __init__
    super().__init__(contents)
TypeError: object.__init__() takes no parameters
因此,
super()
行首先应该在
tuple
中查找
\uuuu init\uuuuu
,tuple的
\uuuu init\uuuuu
当然可以取一个参数(而不是
self
),这就是显式
tuple所调用的参数。那么为什么
super()。\uuuu init\uuuu
调用的工作原理与此不同呢?为什么它试图调用
对象。\uuuu init\uuuu
却失败了

IIUC如果担心继承层次结构会在“动态执行环境”(文档中的短语)中发生变化,并且希望调用特定超类的方法,则只需要显式指定超类。但是这个错误实际上使得必须指定超类。为什么?


注意:如果调用
tuple,这与.

不同.\uuuu init\uuu
它返回
对象.\uuuu init\uuuu
因为
tuple
没有自定义的
\uu init\uuuu
方法,只从
对象继承它。
对象的第一个参数是
self
,而
对象的作用是什么。因此,当您传入
内容时,它将被解释为
self
,并且不会引发异常。但是,它可能不会像您认为的那样做,因为
tuple.\uuuuu new\uuuuu
负责设置一个新的tuple实例


如果使用
super()。\uuuu init\uuuu
它也会解析为
object.\uuuuu init\uuuu
,但它已经将当前“self”绑定为第一个参数。因此,当您将
contents
传递到此函数时,它将被解释为
对象不存在的附加参数。\uuuu init\uuuu
并因此抛出该错误。

不确定获得否决票的问题出了什么问题?说
super()
\uuuuu init\uuuuuuuuuu
不太合拍,这是令人惊讶的,因为IIUC通常会想从
\uuuuu init\uuuuuuuu
调用
super()
!第一个版本似乎只起作用,因为您调用了
tuple.\uuu init\uu()
而没有传递
self
(实际上,您已经将列表
[0,1,2]
传递为
self
)。哦,是的,当通过类名调用实例方法时,我们应该手动传递
self
。谢谢你提醒我!否决权合法的问题得到了合法的回答,这会阻止像我这样的非专家继续提问,因为他们害怕否决权本身!您好,谢谢您,但是为什么要
tuple.\uuuu init\uuuuu
解析为
对象。\uuuu init\uuuuuu
当tuple有自己的
\uuuuu init\uuuuuu
时,它没有一个“自定义”
\uuu init\uuuuu
它只是从
对象继承过来的。这就是我的意思。:)然后PyCharm 2017.1.1出现了一些问题,它向我展示了
def_uuuinit_uuuuuuuself(seq=()):#已知的元组特例。
类元组(对象):
下的
内置.py
@jamadagni我只看了一眼。这意味着它从
对象继承它。但是它确实有一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?这是因为
tuple.\uuuu new\uuuu
是通过
内容隐式调用的吗?
$ MyTupleS.__mro__
(__main__.MyTupleS, tuple, object)