Python函数是以对象形式存储的吗?

3 投票
1 回答
1319 浏览
提问于 2025-04-18 00:17

这个问题是接着之前的一个讨论,想进一步理解这个点:

在函数的情况下,你可以把它看作一个对象,这个对象有一些属性,比如说它的代码(以字节码的形式)、它有多少个参数等等。

我的问题是:

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生成的。)

撰写回答