当前位置: 首页 > 面试题库 >

函数对象是Python吗?

娄德运
2023-03-14
问题内容

我总是在Python中听到此语句(关于主题(例如,装饰器等,当您传递函数等时)),但从未真正看到对此的详细说明。

例如,可以创建一个c仅包含一个抽象方法的类,并使用一组开括号和闭括号将其调用。

i.e class c:
       @abstractmethod
       def method_to_be_called_by():
        ...

这样你就可以

c(whatever parameters are required)

我在这里的理解可能使事情变得遥不可及,我只是对人们的含义感到好奇。


问题答案:

您正在寻找__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进阶教程之函数对象(函数也是对象),包括了python进阶教程之函数对象(函数也是对象)的使用技巧和注意事项,需要的朋友参考一下 秉承着一切皆对象的理念,我们再次回头来看函数(function)。函数也是一个对象,具有属性(可以使用dir()查询)。作为对象,它还可以赋值给其它对象名,或者作为参数传递。 lambda函数 在展开之前,我们先提一下lambda函数。可以利用

  • 问题内容: 有没有一种好的方法来检查对象o是否是内置的Python函数? 我知道我可以使用,例如 因为type(pow)是’builtin_function_or_method’。 但是有更好的方法吗? 问题答案: 类型模块: 不过,如果您仔细观察,就会发现它与您现在所做的没有什么不同。 因此,根据您的情况使用

  • 秉承着一切皆对象的理念,我们再次回头来看函数(function)。函数也是一个对象,具有属性(可以使用dir()查询)。作为对象,它还可以赋值给其它对象名,或者作为参数传递。 lambda函数 在展开之前,我们先提一下lambda函数。可以利用lambda函数的语法,定义函数。lambda例子如下: func = lambda x,y: x + y print func(3,4) lambda生成

  • 我们已经知道,在 JavaScript 中,函数就是值。 JavaScript 中的每个值都有一种类型,那么函数是什么类型呢? 在 JavaScript 中,函数就是对象。 一个容易理解的方式是把函数想象成可被调用的“行为对象(action object)”。我们不仅可以调用它们,还能把它们当作对象来处理:增/删属性,按引用传递等。 属性 “name” 函数对象包含一些便于使用的属性。 比如,一个

  • 我将在后面几节阐述操作于对象的函数的几种可能的接口形式。对于某些操作,你有几种可能的接口形式可供选择,因而你应权衡每一种形式的利弊: 纯函数:对象与/或基本类型作为参数值,但是不改变对象本身。返回值要么是一个基本类型值,要么是函数内部创建的一个新对象。 修改函数:对象作为参数,并且会修改其中一部分或全部对象。通常返回值为空。 填充函数:空对象作为参数之一,由函数填充它。从技术角度讲,这也是一种修改

  • 问题内容: 我正在尝试验证实例属性和类属性之间的区别,该区别由2012年11月1日发布的Python教程2.7.3版第9章:类,第66页最后一行( 源 ): 实例对象的有效方法名称取决于其类。根据定义,作为函数对象的类的所有属性都定义了其实例的相应方法。因此,在我们的示例中,xf是有效的方法引用,因为MyClass.f是函数,而xi则不是,因为MyClass.i不是。 但是xf与MyClass.f