如何更改类属性的追加行为

时间:2015-04-07 22:41:18

标签: python attributes append decorator simpy

我正在使用python包(simpy),它提供了我需要的几个类。其中一个类称为Event,具有以下构造函数:

def __init__(self, env):
    self.env = env
    """The :class:`~simpy.core.Environment` the event lives in."""
    self.callbacks = []
    """List of functions that are called when the event is processed."""
    self._value = PENDING

在代码中的许多不同位置,使用Event.callbacks.append方法将对象添加到事件的回调中。

我需要的是一个新类(我称之为Zombie),它实际上是一个Event类,除了三个修改。首先,它应该包含一个额外的属性Zombie.reset_callbacks和一个方法Zombie.reset(),以便将Zombie.callbacks重置为之前的状态(这就是我需要Zombie.reset_callbacks属性的原因。所有这一切,我可以通过继承Event

来完成

但是,为了实现这一目标,我需要每次调用Zombie.callbacks.append(x)x不仅会附加到Zombie.callbacks,还会附加Zombie.reset_callbacks。我一直在寻找装饰者,看看我是否可以做到这一点,但我没有看到隧道尽头的光。我目前觉得这是不可能的,或者我可能看错了方向。

在Python中这样的事情是否可能(改变类属性的追加行为)?如果是这样,怎么样?

Thanx提前为您付出的努力! 乙

1 个答案:

答案 0 :(得分:1)

糟糕。误读了这个。如果您真的致力于维护此接口,则可以定义帮助程序类。

 class SplitLists(object):
     def __init__(*append_methods):
         self._append_methods = append_methods

     def append(self, value):
         for method in self._append_methods:
              method(value)

a = []
b = []
split_list = SplitLists(a.append, b.append)
split_list.append(1)
a  # [1]
b  # [1]


class Zombie(Event):
     def __init__(self, *args, **kwargs):
         super(Zombie, self).__init__(*args, **kwargs)
         self._real_callbacks = []
         self._reset_callbacks = []
         self.callbacks = SplitLists(self._real_callbacks.append, 
                                     self._reset_callbacks.append)