16

次のように、属性が変更されるたびにプロパティを使用してコードを実行しています。

class SomeClass(object):
    def __init__(self,attr):
        self._attr = attr

    @property
    def attr(self):
        return self._attr

    @attr.setter
    def attr(self,value):
        if self._attr != value:
            self._on_change()
        self._attr = value

    def _on_change(self):
        print "Do some code here every time attr changes"

そして、これはうまくいきます:

>>> a = SomeClass(5)
>>> a.attr = 10
Do some code here every time attr changes

attrしかし、代わりに変更可能なオブジェクトを保存するattrと、セッターと変更検出コードをバイパスして、直接変更できます。

class Container(object):
    def __init__(self,data):
        self.data = data

>>> b = SomeClass(Container(5))
>>> b.attr.data = 10
>>>

attrが type のオブジェクトを格納するためにのみ使用されると仮定しましょうContainer。格納されているオブジェクトが変更されるたびに、変更SomeClassおよび/または実行Containerするエレガントな方法はありますか? つまり、出力を次のようにします。SomeClass_on_changeContainerattr

>>> b = SomeClass(Container(5))
>>> b.attr.data = 10
Do some code here every time attr changes
4

3 に答える 3

1

変更を追跡したいが、異なるクラスのメソッドをジャグリングしたくない場合は、ここから始まる方法でon_change()使用できます。functools.partial

このようにして、データをラップして完全に隠すことができます。取得/変更は、そのオブジェクト内で融合されたいくつかのメソッドを介してのみ可能になります。

NB : python にはプライベート プロパティがなく、規則に従って、私たちは皆大人であり、ルールに反して行動します。あなたの場合、API のユーザーは (作成後に) コンテナーのデータを直接変更しないでください。

注意:他の方法に興味があるかもしれない人のためにここに...

于 2013-11-08T23:32:14.733 に答える