下面的玩具示例看起来有点奇怪,但它显示了我所能说的最简单的问题。
首先,没有问题的部分:
class TupleWrapper(tuple):
def __new__(cls, ignored):
return super(TupleWrapper, cls).__new__(cls, [1, 2, 3])
类TupleWrapper
接受一个任意值,返回一个类似于常量(1, 2, 3)
的元组对象。例如:
>>> TupleWrapper('foo')
(1, 2, 3)
>>> TupleWrapper(8)
(1, 2, 3)
到目前一切尚好。
现在,考虑这个类:
class ListWrapper(list):
def __new__(cls, ignored):
return super(ListWrapper, cls).__new__(cls, [1, 2, 3])
它与TupleWrapper
相同,只是它是list
的子类而不是tuple
的子类。因此,我期望得到以下内容
>>> ListWrapper('foo')
[1, 2, 3]
>>> ListWrapper(8)
[1, 2, 3]
实际上,我得到的是
>>> ListWrapper('foo')
['f', 'o', 'o']
>>> ListWrapper(8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
FWIW,我使用的是Python 2.7.13。
有人能帮我理解这种行为上的差异吗?
有没有可能理解它,或者它只是一个人不得不接受的“那些怪癖之一”?
发布于 2018-07-23 01:31:43
不同之处在于元组是不可变的,所以所有工作都是在__new__
中完成的。列表是可变的,因此它们的构造在__init__
中进行。您还没有覆盖list.__init__
方法,所以它仍然像往常一样构造列表。
PS:从像list或tuple这样的内置继承通常是一种令人沮丧和失望的经历,所以别费心了:)
https://stackoverflow.com/questions/51467582
复制相似问题