1

In case you want to change other variables in a class on change of an attribute you simply just write a property for it. That works fine, if you have a simple data type. But if your variable contains a complex type like a list (not so untypical), the content itself can be changed without calling the variable.setter again.

Are there any callbacks or events that can be used to track changes to a list attribute of a class? What else can be done to keep the code clean and not destroy the inner functionality of the class?

Example:

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

Thinking outside the box is probably the solution. The priority is not to keep the class structure alive, but to find a pattern that works and allows a clean 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)

クリーンで、読み取り専用で、何も問題が発生したり、誤用されたりすることはありません。質問の構造と同じ前提が適用されます。変更したい場合は、リセットする必要があります。しかし、これはユーザーにとって唯一のチャンスなので、ユーザーに伝える必要はありません。ユーザーがまだその理由を疑問に思っている場合は、できれば冗長なクラス docstring を読むことができます。

于 2012-08-13T08:39:48.997 に答える