1. ホーム
  2. python

値変更時に関数を起動させるには?

2023-09-24 09:49:56

質問

私はこの質問がイベントハンドリングに関係していることを理解し、私はPythonのイベントハンドラやディスパッチャについて読んだので、それは私の質問に答えていない、または私は完全に情報を見逃していました。

私はメソッドをしたい m() オブジェクトの A という値でトリガされます。 v が変化したときに起動されます。

例えば(お金があれば幸せになれると仮定して)。

global_wealth = 0

class Person()
    def __init__(self):
        self.wealth = 0
        global global_wealth
        # here is where attribute should be
        # bound to changes in 'global_wealth'
        self.happiness = bind_to(global_wealth, how_happy)

    def how_happy(self, global_wealth):
        return self.wealth / global_wealth

そのため global_wealth の値が変更されると、すべてのクラス Person の値を変更する必要があります。 happiness の値を変更する必要があります。

NBです。 最初のバージョンは、私がゲッターとセッターメソッドを必要とすることを示唆しているようだったので、私は質問を編集する必要がありました。混乱させて申し訳ありません。

どのように解決するのですか?

この問題を解決するには オブザーバパターン . 次のコードでは、ある人が global wealth エンティティからの更新を受け取るためにサブスクライブしています。世界の富に変更があった場合、このエンティティは変更があったことをすべての購読者 (オブザーバ) に警告します。その後、Personは自分自身を更新します。

この例ではプロパティを使用していますが、これは必須ではありません。小さな警告として、プロパティは新しいスタイルクラスでのみ機能するため、クラス宣言の後の (object) は、これが機能するために必須となります。

class GlobalWealth(object):
    def __init__(self):
        self._global_wealth = 10.0
        self._observers = []

    @property
    def global_wealth(self):
        return self._global_wealth

    @global_wealth.setter
    def global_wealth(self, value):
        self._global_wealth = value
        for callback in self._observers:
            print('announcing change')
            callback(self._global_wealth)

    def bind_to(self, callback):
        print('bound')
        self._observers.append(callback)


class Person(object):
    def __init__(self, data):
        self.wealth = 1.0
        self.data = data
        self.data.bind_to(self.update_how_happy)
        self.happiness = self.wealth / self.data.global_wealth

    def update_how_happy(self, global_wealth):
        self.happiness = self.wealth / global_wealth


if __name__ == '__main__':
    data = GlobalWealth()
    p = Person(data)
    print(p.happiness)
    data.global_wealth = 1.0
    print(p.happiness)