0

オブジェクトの属性の値が変更されるたびにトリガーされるハンドラーを作成しようとしています。私はまだ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 ループにより、プログラムがフリーズします...どうすればこれを機能する方法で実装できますか?

4

2 に答える 2

1

事実上プロキシが必要です。ここから少し始めましょう...

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...

__setattribute__また__delattribute__、その他の魔法の方法を探す必要があります...

オブジェクトをインプレースで変更するメソッド呼び出しが存在するかどうかを知る必要があるため、属性が変更されたときにどのように対応するかは少し複雑になる可能性があります... (append上記など)

簡単な Google が思いつきます: http://code.activestate.com/recipes/496741-object-proxying/

于 2012-11-03T18:44:14.377 に答える
1
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))
于 2012-11-03T18:41:20.930 に答える