Python为对象创建处理程序?
我试图创建一个处理程序,每当对象的属性值发生变化时,它就会触发。我对python还是个新手,并没有真正想出任何工作方法。这就是我所做的,我知道它不能像这样工作,它只是为了展示我正在努力实现的目标:Python为对象创建处理程序?,python,handler,Python,Handler,我试图创建一个处理程序,每当对象的属性值发生变化时,它就会触发。我对python还是个新手,并没有真正想出任何工作方法。这就是我所做的,我知道它不能像这样工作,它只是为了展示我正在努力实现的目标: # ../handler.py import copy class Handler: def __init__(self, obj): # Let the object know it's handler obj.handler = self
# ../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.start()函数中的while循环,程序将冻结。。。我怎样才能以有效的方式实现这一点?您实际上需要一个代理,这里有一个开始
class Proxier(object):
def __init__(self, obj):
self.obj = obj
obj.handler = self
def __getattr__(self, key):
return getattr(self.obj, key)
def __setattr__(self, key, value):
if key != 'obj':
oldvalue = getattr(self.obj, key)
if oldvalue != value:
doSomething()
setattr(self.obj, key, value)
else:
setattr(self, key, value)
class Value(object):
def __init__(self, v=None):
self.value = v
myObj = Proxier(Value(2))
class Proxy(object):
def __init__(self, obj):
object.__setattr__(self, '__obj', obj)
def __getattribute__(self, name):
return getattr(object.__getattribute__(self, '__obj'), name)
a = range(10)
p = Proxy(a)
p.append(10) # etc...
您还需要查找\uuuuu setattribute\uuuuuu
和\uuuuu delattribute\uuuuuuu
以及其他神奇的方法
当属性发生变化时,您如何应对可能会有点棘手-因为您必须知道是否存在改变对象位置的方法调用。。。(如上面的append
)
谷歌快速搜索出:你试图解决的问题是什么?为什么程序打印出“handler被改为…”,我如何才能使程序不无限循环到handler.start()?“你试图解决的问题是什么?”要求你陈述一个高层次的目标,而不是一些与你实际需要做的事情无关的低级目标。嗯,谢谢,从来没有听说过在编程中使用这样的术语。。。威尔:我不会这么快就接受答案——不用着急,其他人可能会想出更好的答案!第一次有人说不接受他们的答案。。。好吧,我会取消接受,也许我会学到一些新东西:)但在谷歌的“python处理程序”中找不到太多,而“python代理”给了我更多的信息,所以这基本上就足够我搜索所有需要的信息了。编辑:从谷歌找到了我需要的一切,现在它可以工作了,谢谢。:)没有像
\uuuu delattribute\uuuu