1

如果您想更改on change属性类中的其他变量,您只需property为其编写一个。如果你有一个简单的数据类型,那很好用。但是如果你的变量包含一个复杂的类型,比如一个列表(不是那么不典型),内容本身可以被改变而无需variable.setter再次调用。

是否有任何回调或事件可用于跟踪对类的列表属性的更改?还可以做些什么来保持代码干净而不破坏类的内部功能?

例子:

class Accumulator(object)
  def __init__(self,all_things):
     # :param all_things: a list of stuff of any kind
     self.__all_things = all_things
  @property
  def all_things(self):
     return self.__all_things
  @all_things.setter
  def all_things(self,input):
      self.__all_things = input

跳出框框思考可能是解决方案。首要任务不是保持类结构的活力,而是找到一种可行的模式并允许使用干净的 API!

4

2 回答 2

2

您必须使用列表的自定义子类来检测更改:

class MyList(list):
    on_change_callback = None

    def _notify(self):
        if self.on_change_callback is not None:
            self.on_change_callback(self)

    def __setitem__(self, index, value):
        super(MyList, self).__setitem__(self, index, value)
        self._notify()

    # Etc, each mutating method needs to be overridden.

您需要覆盖每个变异方法,调用原始方法(通过super()),然后调用self._notify(). 有关方法列表,请参阅模拟容器类型部分。

于 2012-08-13T08:19:15.433 回答
1

为了允许讨论和增加创造力,我想自己提供以下解决方案:

class Accumulator(object):

    def __init__(self,all_things):
       #:param all_things: a sequence or generator of stuff of any kind
       self.__all_things = tuple(all_things)

    @property
    def all_things(self):
        return self.__all_things

    @property
    def all_things(self, all_things):
        self.__all_things = tuple(all_things)

它很干净,是只读的,不会出错或被滥用。现在,与问题结构中的假设相同:如果要更改它,则需要重置它。但是你不必告诉用户,因为这是他唯一的机会。如果用户仍然想知道为什么,他可以阅读希望详细的类文档字符串。

于 2012-08-13T08:39:48.997 回答