2013-09-29 42 views
0

考慮到下面的代碼,你如何正確地調度類方法:派遣一個類的方法

>>> 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']是一個不受約束的方法。 這對簡單的函數很簡單,並且是選擇/案例替換的常見習慣用法,用類方法做到這一點的正確方法是什麼?

回答

5

只有綁定的實例時,才能綁定一個方法。您的調度映射只是用類來構建地圖。

建立在__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() 

它使用descriptor protocol結合的方法,這就是通常發生時,方法在實例上查找。

+0

謝謝,我喜歡後面的方法更高效的內存,特別是如果你有大量的實例。恥辱這是如此不可讀。 – AChampion