Python函数是以对象形式存储的吗?
这个问题是接着之前的一个讨论,想进一步理解这个点:
在函数的情况下,你可以把它看作一个对象,这个对象有一些属性,比如说它的代码(以字节码的形式)、它有多少个参数等等。
我的问题是:
1) 我该如何想象一个函数是如何作为一个对象存在的?(NPE在这里回答了这个问题)
2) 我该如何想象一个高阶函数是如何作为一个对象存在的?
3) 我该如何想象模块是如何作为一个对象存在的?比如说 'import operator'。
4) 像 '+'、'>'、'!='、'=='、'=' 这些运算符也是映射到某些对象的方法吗?比如在表达式 'check = 2 < 3' 中,这是否在内部调用了 type(2) 或 type(3) 的某个方法来评估 '<' 运算符?
1 个回答
6
这段话的意思是,在Python中,函数和其他对象一样,都是对象。
举个例子:
In [5]: def f(): pass
现在,f
就是一个类型为function
的对象:
In [6]: type(f)
Out[6]: function
如果你仔细看看,它里面有很多字段:
In [7]: dir(f)
Out[7]:
['__call__',
...
'func_closure',
'func_code',
'func_defaults',
'func_dict',
'func_doc',
'func_globals',
'func_name']
比如说,f.func_name
就是这个函数的名字:
In [8]: f.func_name
Out[8]: 'f'
而f.func_code
里面包含了函数的代码:
In [9]: f.func_code
Out[9]: <code object f at 0x11b5ad0, file "<ipython-input-5-87d1450e1c01>", line 1>
如果你真的很想知道,可以继续深入了解:
In [10]: dir(f.func_code)
Out[10]:
['__class__',
...
'co_argcount',
'co_cellvars',
'co_code',
'co_consts',
'co_filename',
'co_firstlineno',
'co_flags',
'co_freevars',
'co_lnotab',
'co_name',
'co_names',
'co_nlocals',
'co_stacksize',
'co_varnames']
等等。
(以上输出是用Python 2.7.3生成的。)