我有这段代码:
class ReplaceableClass(Object):
def __init__(self, x):
self.x = [x]
def movedata(self, old):
self.x = old.x + self.x
class Example(Object):
myThing = ReplaceableClass(1)
e = Example()
e.myThing = ReplaceableClass(2)
如何通过以下块替换最后一行?
myNewThing = ReplaceableClass(2)
myNewThing.movedata(e.myThing)
e.myThing = myNewThing
所以e.myThing.x
等于[1,2]而不是[2]。
我尝试使用描述符,但它无法分配新对象,因为它会导致无限循环:
class ReplaceableClass(Object):
[...]
def __set__(self,a,b):
for p in dir(a):
if self==getattr(a,p):
self.movedata(b)
答案 0 :(得分:1)
有两种选择:
在self.__dict__
中使用movedata
以避免无限循环。 self.__dict__
是包含实例中所有属性的原始字典;如果直接访问dict,则不会调用描述符API使用的方法。
如果您只有几个属性,则可以使用属性API(请参阅the property() function),这样可以在特定属性发生更改时执行某些操作(在本例中为{ {1}})。
答案 1 :(得分:0)
如果我知道你可以像
那样简单class Example(object):
myThing = (1,)
e = Example()
e.myThing+= (2,)
>>> e.myThing
(1, 2)
>>> Example.myThing
(1,)
如果您需要更多功能,可以扩展tuple
或创建自己的不可变集合:
from itertools import chain
class ReplaceableClass(object):
def __init__(self, *x):
self._data = tuple(x)
def __add__ (self, other):
return ReplaceableClass(*(chain(self, other)))
def __iter__(self):
return iter(self._data )
def __repr__(self):
return 'ReplaceableClass(%s)'%(', '.join(map(repr,self._data)))
class Example(object):
myThing = ReplaceableClass(1)
e = Example()
e.myThing+= (2,3)
>>> e.myThing
ReplaceableClass(1, 2, 3)
>>> Example.myThing
ReplaceableClass(1)