ModelからViewに通知したいという要件として認識しました。
Eventを発火させる部分はデコレータでもう少し簡単に記述できそうですが。
こんな感じのコードでどうでしょうか。
Python
1# -*- coding: utf-8 -*-
2from copy import deepcopy
3from inspect import currentframe
4from pprint import pformat
5
6
7class EventHandler(object):
8 def __init__(self):
9 self._observers = []
10
11 def append(self, listener):
12 """
13 Listenerの追加
14 :param listener:
15 :return:
16 """
17 assert listener is not None
18 if listener not in self._observers:
19 self._observers.append(listener)
20 return self
21
22 def remove(self, listener):
23 """
24 Listenerの削除
25 :param listener:
26 :return:
27 """
28 self._observers.remove(listener)
29 return self
30
31 def fire(self, sender: str, new_value):
32 for callback in self._observers:
33 callback(sender, new_value)
34
35 def __iadd__(self, other):
36 return self.append(other)
37
38 def __isub__(self, other):
39 return self.remove(other)
40
41
42class Model(object):
43 """
44 モデル
45 """
46 def __init__(self):
47 self.handler = EventHandler()
48 self._TopMost = True
49 self._ForeColor = "#000000"
50 self._BackColor = "#000000"
51
52 @property
53 def top_most(self) -> bool:
54 return self._TopMost
55
56 @top_most.setter
57 def top_most(self, value: bool) -> None:
58 self._TopMost = value
59 self.handler.fire(currentframe().f_code.co_name, value)
60
61 @property
62 def fore_color(self) -> str:
63 return self._ForeColor
64
65 @fore_color.setter
66 def fore_color(self, value: str) -> None:
67 self._ForeColor = value
68 self.handler.fire(currentframe().f_code.co_name, value)
69
70 @property
71 def back_color(self) -> str:
72 return self._BackColor
73
74 @back_color.setter
75 def back_color(self, value: str) -> None:
76 self._BackColor = value
77 self.handler.fire(currentframe().f_code.co_name, value)
78
79 def __deepcopy__(self, memo):
80 cls = self.__class__
81 result = cls.__new__(cls)
82 memo[id(self)] = result
83 for k, v in self.__dict__.items():
84 setattr(result, k, deepcopy(v, memo))
85 return result
86
87 def __repr__(self):
88 return pformat(vars(self), indent=4, width=1)
89
90
91def changed(sender, val):
92 print(sender, val)
93
94
95def main():
96 """
97 エントリーポイント
98 """
99 model = Model()
100 model.handler += changed
101 print(model)
102 print("#" * 60)
103 model.top_most = False
104 model.fore_color = "#AAAAAA"
105 print(model)
106
107if __name__ == '__main__':
108 main()
109
■参考情報