是__dict __。update()oldstyle?

时间:2011-08-03 23:46:37

标签: python pygame python-2.7 new-style-class

我对阅读newstyle vs oldstyle属性的差异感到困惑。在这个例子中:

  1. 此代码是否使用旧式方法修改属性?

    Event() self.__dict__.update(kw)

  2. 我是否使用getattr, getattr getattribute

    for Dispatcher.dispatch_to_parent()

  3. 代码来自http://www.pygame.org/wiki/CommandDispatch?parent=CookBook

    class Event(object):
        def __init__(self, name, kw={}):
            self.name = name
            self.__dict__.update(kw)
            self.dict = dict(kw)
            self.method_name = 'EVT_%s' % self.name
    
        def __repr__(self):
            return "<event>" % (self.name, self.dict)
    
    class Dispatcher(object):
        def add(self, other):
            if isinstance(other, Dispatcher):
                other.parent = self
            else:
                raise ValueError("%s is not a Dispatcher" % other)
    
        def remove(self, other):
            if isinstance(other, Dispatcher):
                if other.parent is self:
                    del other.parent
                else:
                    raise ValueError("%s is not my child." % other)
            else:
                raise ValueError("%s is not a Dispatcher" % other)
    
        def dispatch(self, event):
            method = getattr(self, event.method_name, None)
            if method is not None: 
                return method(event)
            else:
                self.dispatch_to_parent(event)
    
        def dispatch_to_parent(self, event):
            parent = getattr(self, 'parent', None)
            if parent is not None:
                dispatch = getattr(parent, 'dispatch', None)
                if dispatch is not None: 
                    return dispatch(event)
    
    class Root(Dispatcher):
        def __init__(self):
            Dispatcher.__init__(self)
            self.focused_node = self
    
        def focus(self, node):
            if node is self.focused_node: return
            print 'focusing on', node
            self.focused_node.dispatch(Event('BLUR'))
            self.focused_node = node
            node.dispatch(Event('FOCUS'))
    
        def blur(self, node):
            self.focused_node = self
            node.dispatch(Event('BLUR'))
    
        def post(self, event_name, kw):
            event = Event(event_name, kw)
            return self.focused_node.dispatch(event)
    
    if __name__ == "__main__":
        class Button(Dispatcher):
            def EVT_KeyDown(self, event):
                return self
        #create the root node, which is the receiver of all events.        
        r = Root()
        #create a button node
        b = Button()
        #add the button node to the application
        r.add(b)
        #give the button node focus, it will now receive events
        r.focus(b)
        #post a KeyDown event, which the button will receive
        print r.post('KeyDown')
        #post a Quit event, which the button will not receive. 
        #this event will be passed onto the button parent
        print r.post('Quit')
        #the return value of the post method is the node which handled the event
    

2 个答案:

答案 0 :(得分:3)

您不应直接更新实例字典,您将绕过自定义设置器。循环键并执行setattr。

答案 1 :(得分:0)

def post(self, event_name, kw):

中缺少*

由于使您能够接收dict作为参数,您需要在变量名称之前添加**:

def post(self, event_name, **kw):
    event = Event(event_name, kw)
    return self.focused_node.dispatch(event)