我有方法词典:
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
作为第一个参数传递?
答案 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']()
应该工作。