如何处理innerclass属性依赖?

时间:2012-08-13 07:48:08

标签: python list

如果您想要更改属性的类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!

2 个答案:

答案 0 :(得分: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()。有关方法列表,请参阅Emulating container types部分。

答案 1 :(得分: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)

它很干净,它是只读的,没有任何错误或被滥用。现在同样的假设适用于问题的结构:如果你想改变它,你需要重置它。但你不必告诉用户,因为这是他唯一的机会。如果用户仍然想知道为什么,他可以阅读有希望的详细类docstring。