关于继承:Python忽略在继承的类中提供给元组的参数的默认值

Python ignores default values of arguments supplied to tuple in inherited class

下面是一些代码来演示我在说什么。

1
2
3
4
5
6
class Foo(tuple):
   def __init__(self, initialValue=(0,0)):
      super(tuple, self).__init__(initialValue)

print Foo()
print Foo((0, 0))

我希望这两个表达式产生完全相同的结果,但是这个程序的输出是:

1
2
()
(0, 0)

我在这里不明白什么?


这是因为tuple类型不关心__init__的参数,只关心__new__的参数。这将使其工作:

1
2
3
4
class Bar(tuple):
    @staticmethod
    def __new__(cls, initialValue=(0,0)):
        return tuple.__new__(cls, initialValue)

这样做的基本原因是,由于元组是不可变的,所以在您甚至可以在Python级别看到它们之前,需要用它们的数据预先构造它们。如果数据是通过__init__提供的,那么在您自己的__init__的开头基本上会有一个空元组,当您调用super().__init__()时,它会发生更改。