您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

函数对象是Python吗?

函数对象是Python吗?

您正在寻找__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()现有函数实例来获取

我还传入了我的解释器的全局名称空间,以及一个名称。后者是可选参数;该名称否则从代码对象获取

python 2022/1/1 18:44:40 有305人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶