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)