回答編集履歴

4

追記

2018/09/20 17:57

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -241,3 +241,5 @@
241
241
  - [Does Python classes support events like other languages? | stackoverflow](https://stackoverflow.com/questions/6158602)
242
242
 
243
243
  - [Event system in Python | stackoverflow](https://stackoverflow.com/questions/1092531/event-system-in-python)
244
+
245
+ - [Pythonの変数の変化を検知してEventを起こしたい | teratail](https://teratail.com/questions/124221)

3

追記

2018/09/20 17:57

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -239,3 +239,5 @@
239
239
  - [Python でイベント指向のプログラミングを実現する | emptypage.jp](https://emptypage.jp/notes/pyevent.html)
240
240
 
241
241
  - [Does Python classes support events like other languages? | stackoverflow](https://stackoverflow.com/questions/6158602)
242
+
243
+ - [Event system in Python | stackoverflow](https://stackoverflow.com/questions/1092531/event-system-in-python)

2

追記

2018/09/20 17:48

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -234,6 +234,8 @@
234
234
 
235
235
  ■参考情報
236
236
 
237
- - [29.12. inspect — 活動中のオブジェクトの情報を取得する](https://docs.python.jp/3/library/inspect.html)
237
+ - [29.12. inspect — 活動中のオブジェクトの情報を取得する | docs.python.jp](https://docs.python.jp/3/library/inspect.html)
238
-
238
+
239
- - [Python でイベント指向のプログラミングを実現する](https://emptypage.jp/notes/pyevent.html)
239
+ - [Python でイベント指向のプログラミングを実現する | emptypage.jp](https://emptypage.jp/notes/pyevent.html)
240
+
241
+ - [Does Python classes support events like other languages? | stackoverflow](https://stackoverflow.com/questions/6158602)

1

追記

2018/09/20 17:34

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,5 +1,9 @@
1
1
  ModelからViewに通知したいという要件として認識しました。
2
2
 
3
+
4
+
5
+ Eventを発火させる部分はデコレータでもう少し簡単に記述できそうですが。
6
+
3
7
  こんな感じのコードでどうでしょうか。
4
8
 
5
9
 
@@ -18,6 +22,76 @@
18
22
 
19
23
 
20
24
 
25
+ class EventHandler(object):
26
+
27
+ def __init__(self):
28
+
29
+ self._observers = []
30
+
31
+
32
+
33
+ def append(self, listener):
34
+
35
+ """
36
+
37
+ Listenerの追加
38
+
39
+ :param listener:
40
+
41
+ :return:
42
+
43
+ """
44
+
45
+ assert listener is not None
46
+
47
+ if listener not in self._observers:
48
+
49
+ self._observers.append(listener)
50
+
51
+ return self
52
+
53
+
54
+
55
+ def remove(self, listener):
56
+
57
+ """
58
+
59
+ Listenerの削除
60
+
61
+ :param listener:
62
+
63
+ :return:
64
+
65
+ """
66
+
67
+ self._observers.remove(listener)
68
+
69
+ return self
70
+
71
+
72
+
73
+ def fire(self, sender: str, new_value):
74
+
75
+ for callback in self._observers:
76
+
77
+ callback(sender, new_value)
78
+
79
+
80
+
81
+ def __iadd__(self, other):
82
+
83
+ return self.append(other)
84
+
85
+
86
+
87
+ def __isub__(self, other):
88
+
89
+ return self.remove(other)
90
+
91
+
92
+
93
+
94
+
21
95
  class Model(object):
22
96
 
23
97
  """
@@ -28,14 +102,14 @@
28
102
 
29
103
  def __init__(self):
30
104
 
105
+ self.handler = EventHandler()
106
+
31
107
  self._TopMost = True
32
108
 
33
109
  self._ForeColor = "#000000"
34
110
 
35
111
  self._BackColor = "#000000"
36
112
 
37
- self._observers = []
38
-
39
113
 
40
114
 
41
115
  @property
@@ -52,7 +126,7 @@
52
126
 
53
127
  self._TopMost = value
54
128
 
55
- self._fire_property_change(currentframe().f_code.co_name, value)
129
+ self.handler.fire(currentframe().f_code.co_name, value)
56
130
 
57
131
 
58
132
 
@@ -70,7 +144,7 @@
70
144
 
71
145
  self._ForeColor = value
72
146
 
73
- self._fire_property_change(currentframe().f_code.co_name, value)
147
+ self.handler.fire(currentframe().f_code.co_name, value)
74
148
 
75
149
 
76
150
 
@@ -88,49 +162,7 @@
88
162
 
89
163
  self._BackColor = value
90
164
 
91
- self._fire_property_change(currentframe().f_code.co_name, value)
165
+ self.handler.fire(currentframe().f_code.co_name, value)
92
-
93
-
94
-
95
- def add_listener(self, listener):
96
-
97
- """
98
-
99
- Listenerの追加
100
-
101
- :param listener:
102
-
103
- :return:
104
-
105
- """
106
-
107
- if listener not in self._observers:
108
-
109
- self._observers.append(listener)
110
-
111
-
112
-
113
- def remove_listener(self, listener):
114
-
115
- """
116
-
117
- Listenerの削除
118
-
119
- :param listener:
120
-
121
- :return:
122
-
123
- """
124
-
125
- self._observers.remove(listener)
126
-
127
-
128
-
129
- def _fire_property_change(self, name: str, new_value):
130
-
131
- for callback in self._observers:
132
-
133
- callback(name, new_value)
134
166
 
135
167
 
136
168
 
@@ -158,9 +190,9 @@
158
190
 
159
191
 
160
192
 
161
- def changed(aa, val):
193
+ def changed(sender, val):
162
-
194
+
163
- print(aa, val)
195
+ print(sender, val)
164
196
 
165
197
 
166
198
 
@@ -176,13 +208,17 @@
176
208
 
177
209
  model = Model()
178
210
 
179
- model.add_listener(changed)
211
+ model.handler += changed
212
+
213
+ print(model)
214
+
215
+ print("#" * 60)
180
216
 
181
217
  model.top_most = False
182
218
 
183
219
  model.fore_color = "#AAAAAA"
184
220
 
185
-
221
+ print(model)
186
222
 
187
223
 
188
224
 
@@ -193,3 +229,11 @@
193
229
 
194
230
 
195
231
  ```
232
+
233
+
234
+
235
+ ■参考情報
236
+
237
+ - [29.12. inspect — 活動中のオブジェクトの情報を取得する](https://docs.python.jp/3/library/inspect.html)
238
+
239
+ - [Python でイベント指向のプログラミングを実現する](https://emptypage.jp/notes/pyevent.html)