我需要默认情况下具有元组行为的变量实例。最初它必须正好是 (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"