我有这个代码:
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)
它怎么能像我用以下 block 替换最后一行一样工作?
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)
请您参考如下方法:
有两种选择:
在
movedata中使用self.__dict__来避免死循环。self.__dict__是包含实例中所有属性的原始字典;如果直接访问字典,则不会调用描述符 API 使用的方法。如果您只有几个属性,则可以使用属性 API(请参阅 the property() function),它允许您在特定属性更改时执行某些操作(在本例中为
我的东西).
