オブジェクトの属性の値が変更されるたびにトリガーされるハンドラーを作成しようとしています。私はまだPythonを使ったばかりで、実際に機能する方法を思いつきませんでした。これは私がやったことであり、このように機能しないことはわかっています。これは、私が達成しようとしていることを示すためだけです:
# ../handler.py
import copy
class Handler:
def __init__(self, obj):
# Let the object know it's handler
obj.handler = self
# Copy the object
self.copy = copy.deepcopy(obj)
# Let handler know it's object
self.obj = obj
# Handler not running atm.
self.running = False
def start(self):
# Running
self.running = True
# As long as running...
while self.running:
# Loop through all objects attributes
for attr in self.obj.__dict__:
# If attribute's value has changed
if self.copy.__dict__[attr] != self.obj.__dict__[attr]:
# Print out a message
print("%s was changed to %s" %(attr, self.obj.__dict__[attr]))
# Update the value to our copy
self.copy.__dict__[attr] = self.obj.__dict__[attr]
def stop(self):
# Not running
self.running = False
主なファイルはこちら
# ../main.py
from handler import Handler
class Value:
def __init__(self, v=None):
self.value = v
def createObject(v):
obj = Value(v)
Handler(obj)
return obj
myObj = createObject(5)
myObj.handler.start()
ただし、これにより、このテキストが出力されます。しかし、handler was changed to <Handler.Handler object at 0x0000000002B1FC50>
ここでハンドラーを変更していませんか? また、Handler.start() 関数内の while ループにより、プログラムがフリーズします...どうすればこれを機能する方法で実装できますか?