以下是一些代码,用于演示我正在谈论的内容。
class Foo(tuple):
def __init__(self, initialValue=(0,0)):
super(tuple, self).__init__(initialValue)
print Foo()
print Foo((0, 0))
我希望两个表达式都能得到完全相同的结果,但是这个程序的输出是:
()
(0, 0)
我在这里不理解什么?
答案 0 :(得分:10)
这是因为tuple
类型不关心__init__
的参数,而只涉及__new__
的参数。这将使它工作:
class Bar(tuple):
@staticmethod
def __new__(cls, initialValue=(0,0)):
return tuple.__new__(cls, initialValue)
这个的基本原因是,由于元组是不可变的,所以在你甚至可以在Python级别看到它们之前,需要预先构造它们的数据。如果数据是通过__init__
提供的,那么您自己__init__
的开头基本上会有一个空元组,然后在您调用super().__init__()
时会发生变化。