4

鉴于以下代码,您如何正确调度类方法:

>>> class A:
...     def a(self):
...         pass
...     def b(self):
...         pass
...     c = a
...     dispatch_map = { 'a' : a, 'b' : b }
...     def dispatch(self, arg):
...         self.dispatch_map[arg]()   # Fail: unbound method!
>>> A().c
<bound method A.a of <__main__.A object at 0x100550210>>
>>> A().dispatch_map['a']
<function a at 0x10054acf8>

为什么是c绑定方法,而是dispatch_map['a']未绑定方法。这对于普通函数很简单,并且是选择/案例替换的常见习惯用法,使用类方法执行此操作的正确方法是什么?

4

1 回答 1

12

只有在有要绑定的实例时才能绑定方法。您的调度地图仅使用类构建地图。

在以下位置构建地图__init__

def __init__(self):
    self.dispatch_map = { 'a' : self.a, 'b' : self.b }

或在您的方法中显式绑定dispatch()方法:

def dispatch(self, arg):
    bound = self.dispatch_map[arg].__get__(self, type(self))
    bound()

这使用描述符协议来绑定方法,这通常是在实例上查找方法时发生的情况。

于 2013-09-29T08:16:05.740 回答