首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么子类化元组和子类化列表之间存在这种差异?

为什么子类化元组和子类化列表之间存在这种差异?
EN

Stack Overflow用户
提问于 2018-07-23 01:26:28
回答 1查看 127关注 0票数 2

下面的玩具示例看起来有点奇怪,但它显示了我所能说的最简单的问题。

首先,没有问题的部分:

代码语言:javascript
复制
class TupleWrapper(tuple):
    def __new__(cls, ignored):
        return super(TupleWrapper, cls).__new__(cls, [1, 2, 3])

TupleWrapper接受一个任意值,返回一个类似于常量(1, 2, 3)的元组对象。例如:

代码语言:javascript
复制
>>> TupleWrapper('foo')
(1, 2, 3)
>>> TupleWrapper(8)
(1, 2, 3)

到目前一切尚好。

现在,考虑这个类:

代码语言:javascript
复制
class ListWrapper(list):
    def __new__(cls, ignored):
        return super(ListWrapper, cls).__new__(cls, [1, 2, 3])

它与TupleWrapper相同,只是它是list的子类而不是tuple的子类。因此,我期望得到以下内容

代码语言:javascript
复制
>>> ListWrapper('foo')
[1, 2, 3]
>>> ListWrapper(8)
[1, 2, 3]

实际上,我得到的是

代码语言:javascript
复制
>>> 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。

有人能帮我理解这种行为上的差异吗?

有没有可能理解它,或者它只是一个人不得不接受的“那些怪癖之一”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-23 01:31:43

不同之处在于元组是不可变的,所以所有工作都是在__new__中完成的。列表是可变的,因此它们的构造在__init__中进行。您还没有覆盖list.__init__方法,所以它仍然像往常一样构造列表。

PS:从像list或tuple这样的内置继承通常是一种令人沮丧和失望的经历,所以别费心了:)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51467582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档