2012-01-18 40 views
2

我有方法的字典:製作詞典功能表現得像類的方法

def name(self): 
    print self.name 

def age(self): 
    print self.age 

display = { 
    'name': name, 
    'age': age 
} 

而且我有一個類Person,我想display['name']()display['age']()的方式工作:

class Person: 
    def __init__(self): 
     self.name = 'Bob' 
     self.age = 22 
     self.showName = display['name'] 
     self.showAge = display['age'] 

person = Person() 

問題是當我打電話person.showName()我得到錯誤

TypeError: showName() takes exactly 1 argument (0 given)

如何使函數showName像一個方法一樣工作,並將第一個參數默認地傳遞self

+0

[在python中添加方法到加載的類/模塊]可能的重複(http://stackoverflow.com/questions/7749914/add-method-to-loaded-class-module-in-python) –

+0

對不起,誤讀這個問題 - 它不是那個的重複。 –

+0

您是否知道類方法和實例方法之間的區別?標題中的措詞是故意的,還是你困惑的東西? –

回答

4

簡單的方法是移動的__init__之外你的函數定義:

>>> class Person: 
...  showName = display['name'] 
...  showAge = display['age'] 
...  def __init__(self): 
...    self.name = 'Bob' 
...    self.age = 22 
... 
>>> Person().showAge() 
22 

哈爾德的辦法就是明白爲什麼會發生這種情況,並使用MethodType

>>> class Person: 
...  def __init__(self): 
...    self.name = 'Bob' 
...    self.age = 22 
...    self.showName = types.MethodType(display['name'], self) 
...    self.showAge = types.MethodType(display['age'], self) 
... 
>>> Person().showAge() 
22 

總之,一個函數應該是在執行object.attribute查找時被威脅有點特殊的一種方法。這個威脅還包括傳遞你的函數期望的self參數。 MethodType將函數綁定到某個對象,從而創建一個方法。

第一個例子的工作原理是自定義與類定義一起定義的函數。

+0

不知道methodtype,非常好。 –

+0

「類型」的替代方法。MethodType(display ['name'],self)''是display ['name'] .__ get __(self)'。 –

+0

我現在有一個上下文問題。 'showName'的上下文不包含'Person'上下文中的函數。 – Randomblue

-2

這樣做:

display['name']() 

應該工作。

+1

他在他的問題中寫道,他已經知道這一點。他想要正常的方法調用語法。 –

0

您可以使用類似:

self.showName = lambda : display['name'](self) 
+1

這是一個可怕的解決方案,也是非常糟糕的lambda錯誤使用。 –

+0

+1;這是一個破解,但它可靠地工作。 –

1
from functools import partial 
class Person: 
    def __init__(self): 
     self.showName = partial(display['name'], self=self) 

partial允許傳遞參數給封裝的功能比lambda,如果你有任何需要在未來更多的參數更好的支持。

+2

雖然這個工程,有一個[更好的解決方案](http://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object)。 –

+0

謝謝,不知道那一個 –