使字典功能像类方法一样

时间:2012-01-18 13:30:37

标签: python

我有方法词典:

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()只需1个参数(0给定)

如何使函数showName像方法一样,并隐式地将self作为第一个参数传递?

4 个答案:

答案 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接受函数并将其绑定到某个对象,从而创建一个方法。

第一个示例有效,因为与类定义一起定义的函数会自动作为方法进行威胁。

答案 1 :(得分:1)

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

partial允许更好地支持将参数传递给封装函数而不是lambda,如果将来需要更多参数的话。

答案 2 :(得分:0)

您可以使用以下内容:

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

答案 3 :(得分:-2)

这样做:

display['name']()

应该工作。