在python中,函数是一个对象吗?

时间:2014-07-11 21:59:29

标签: python function oop python-2.7

理解这种行为有点难:

def a():
   pass


type(a)
>> function

type的{​​{1}}为afunction的{​​{1}}是什么?

type

为什么来自function的{​​{1}}的{​​{1}}为type(function) >> NameError: name 'function' is not defined

type

上一条:如果typea,为什么我不能这样做:

type

谢谢!

2 个答案:

答案 0 :(得分:5)

任何函数的类型都是<type 'function'>。与<type 'type'>一样,函数类型的类型为type(type(a))type(function)不起作用的原因是因为type(function)正在尝试获取名为function的未声明变量的类型,而不是实际函数的类型(即function是不是关键词)。

您在课程定义中收到元类错误,因为a的类型为function而您can't subclass functions in Python

很多好消息in the docs

答案 1 :(得分:3)

function的类型是type,它是Python中的基本元类。元类是类的类。您也可以使用type作为函数来告诉您对象的类型,但这是一个历史工件。

types模块为您提供了对大多数内置类型的直接引用。

>>> import types
>>> def a():
...    pass
>>> isinstance(a, types.FunctionType)
True
>>> type(a) is types.FunctionType

原则上,你甚至可以直接实例化types.FunctionType类并动态创建一个函数,虽然我无法想象这样做的合理情况:

>>> import types
>>> a = types.FunctionType(compile('print "Hello World!"', '', 'exec'), {}, 'a')
>>> a
<function a at 0x01FCD630>
>>> a()
Hello World!
>>>

您不能对某个功能进行子类化,这就是您最后一个代码段失败的原因,但无论如何都不能将types.FunctionType作为子类。