在一个实例中,如何检测何时使用新实例成员替换类成员?

时间:2012-03-07 17:32:48

标签: python

我有这段代码:

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)

2 个答案:

答案 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)