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

我试图创建一个处理程序,每当对象的属性值发生变化时,它就会触发。我对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.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