从标准元组类继承不当



我需要默认情况下具有元组行为的变量实例。最初它必须正好是 (1,1)这就是我创建从元组类继承的类的原因。但是一个新创建的对象最初等于 (,)(不是我需要的 (1,1)。

有以下代码,但它不能像我想要的那样正常工作。

class FooClass(tuple):
    def __init__(self):
        self = (1,1)

我需要新创建的对象像这样工作:

t = FooClass() # t must be (1,1) now
t = t[:-1] + (t[-1]+1,)
#t now must be (1,2)

我做错了什么?

您正在重新绑定__init__方法中的self;这不会在重新绑定对象之前更改self引用的对象。您只需将局部变量指向一个新对象。

但是,元组是不可变的,它们的子类也是不可变的。在调用__init__时,您无法再更改self

您需要在此处使用 __new__ 方法来影响实例的创建方式; __new__ 是构造函数,__init__是初始值设定项:

class FooClass(tuple):
    def __new__ (cls):
        return super(FooClass, cls).__new__(cls, (1,2))

演示:

>>> class FooClass(tuple):
...     def __new__ (cls):
...         return super(FooClass, cls).__new__(cls, (1,2))
... 
>>> t = FooClass()
>>> t[:-1] + (t[-1]+1,)
(1, 3)

请注意,最后一个表达式再次生成元组;切片对象仍返回元组:

>>> type(t)
<class '__main__.FooClass'>
>>> type(t[:-1])
<type 'tuple'>

根据您尝试执行的操作,您可能需要重写某些容器方法。

注意,self 是对对象的引用。通过做

self = (1, 1)

您只是将变量 self 分配给即将被垃圾回收的新元组。Self不是一个合适的python关键字,你可以称它为"mike"或"something"

最新更新