2012-11-03 5 views
0

개체의 특성 값이 변경 될 때마다 트리거하는 처리기를 만들려고합니다. 저는 여전히 파이썬에 대한 새로운 지식을 가지고 있으며 실제로 작동하는 방법을 찾지 못했습니다. , 다음 주 파일객체를위한 파이썬 생성자를 만드시겠습니까?

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

을 : 그것은 내가 달성하기 위해 노력하고있어 보여 그냥, 이것은 내가 무엇을했는지, 그리고 나는 이런 식으로 작동하지 않을 수있어 그러나,이 텍스트 결과를 인쇄 할 결과 : handler was changed to <Handler.Handler object at 0x0000000002B1FC50>하지만 여기에 처리기를 변경하지 않는거야? 또한 Handler.start() 함수의 while 루프로 인해 프로그램이 멈 춥니 다. 어떻게 작동시킬 수 있습니까?

+0

해결하려는 문제는 무엇인가요? – user4815162342

+0

"핸들러가 ...로 변경되었습니다"라는 프로그램이 인쇄되는 이유는 무엇이며, 프로그램을 Handler.start()에 무한 루프가되지 않게하려면 어떻게해야합니까? –

+4

"해결하려는 문제는 무엇인가?"는 실제로 수행해야하는 것과 관련이없는 저고준 목표가 아니라 고차원 목표를 제시 할 것을 요구합니다. –

답변

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... 
또한 __setattribute____delattribute__ 및 기타 마법의 방법을 찾아해야합니다

...

속성이 변경 될 때 어떻게하면 좋을지 - 객체를 변경 한 메소드 호출이 존재하는지 알 필요가 있습니다 (예 : append 위)

빠른 Google이 제공됩니다. http://code.activestate.com/recipes/496741-object-proxying/

+0

흠, 프로그래밍에 사용 된 용어를 들어 본 적이 없으므로 ... 들어갈 수 있습니다. –

+0

나는 신속하게 답을 빨리 받아들이지 않을 것입니다. 서두르지 않고 다른 사람들이 더 잘 올 수 있습니다! –

+0

Uh, wtf Oo 처음에는 누구나 대답을 받아들이지 않는다고 말한 적이 있습니다 ... 글쎄요, 그때 받아 들일 수는 없지만 어쩌면 제가 새로운 것을 배울 것입니다 :) 그러나 구글의 "python handler" , "python proxy"는 나에게 훨씬 더 많은 정보를 주었다. 그래서 이것은 기본적으로 내가 필요한 모든 정보를 검색하기에 충분하다. –

0
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)) 
관련 문제