値変更時に関数を起動させるには?
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)
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] 値で列挙名を取得する [重複]。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] 辞書のキーと値を交換するにはどうすればよいですか?
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複