您正在寻找__call__
方法。函数对象具有该方法:
>>> def foo(): pass
...
>>> foo.__call__
<method-wrapper '__call__' of function object at 0x106aafd70>
并不是说Python解释程序循环在遇到Python函数对象时实际上就使用了该方法;在大多数情况下,实现中的优化直接跳转到所包含的字节码。
但是您 可以 在自己的自定义类上使用它:
class Callable(object):
def __init__(self, name):
self.name = name
def __call__(self, greeting):
return '{}, {}!'.format(greeting, self.name)
演示:
>>> class Callable(object):
... def __init__(self, name):
... self.name = name
... def __call__(self, greeting):
... return '{}, {}!'.format(greeting, self.name)
...
>>> Callable('World')('Hello')
'Hello, World!'
Python的创建函数对象 当你使用def
的语句, 或者 你使用一个lambda
表达式:
>>> def foo(): pass
...
>>> foo
<function foo at 0x106aafd70>
>>> lambda: None
<function <lambda> at 0x106d90668>
您可以将其与使用文字语法创建字符串,整数或列表进行比较:
listobject = [1, 'two']
上面的代码创建了3个对象,而没有调用类型,Python根据所使用的语法为您完成了所有这些工作。同样适用于功能。
自己创造一个可能会有些复杂。您至少需要一个代码对象并引用一个全局名称空间:
>>> function_type = type(lambda: None)
>>> function_type
<type 'function'>
>>> function_type(foo.__code__, globals(), 'bar')
<function bar at 0x106d906e0>
在这里,我通过重用function
类型从foo
函数中获取代码对象来创建函数对象;函数类型不是内置名称,但是该类型确实存在,可以通过调用type()
现有函数实例来获取。