为什么Python函数有__dict__?

9 投票
3 回答
5813 浏览
提问于 2025-04-17 02:24

在Python中,用 deflambda 创建的函数都有一个叫 __dict__ 的属性,这样你就可以动态地给它们添加属性。不过,每个函数都有一个 __dict__ 是要占用内存的。在CPython 2.6中,一个空的 dict 就要占用140个字节。

给函数添加属性并不是特别常见的做法,如果你确实需要一个带有特殊属性的函数,可以使用一个自定义对象,并且这个对象要有一个 __call__ 方法。

既然给函数添加自定义属性并不常见,而且 __dict__ 还要占用内存,那为什么Python的函数还要有 __dict__ 呢?

3 个回答

3

如果你不需要一个空字典,它就不存在。下面是用来检查这个的代码:

import gc
f = lambda :1
print {} in gc.get_referents(f)
f.__dict__
print {} in gc.get_referents(f)
6

在Python中,用def和lambda创建的函数都有一个叫做__dict__的属性,这样你就可以动态地给它们添加属性。

没错,毕竟它们都是对象。

每个函数都有一个__dict__,这会占用一些内存。在CPython 2.6中,一个空的字典大约需要140个字节。

对我来说是124个字节。其实这对讨论来说并不太重要。

如果你真的想节省每一个字节,那你就不会用Python了。在一个使用大量内存的程序中,函数通常只占用很小的一部分对象,所以这点额外的内存开销其实并不算什么。在我看来,你更应该担心的是每个浮点值要花费16个字节,而且你不能从double切换到float。当然,解决这个问题的方法是使用Numpy。:)

给函数添加属性并不是特别常见的事情。

如果你来自Java、C++或C#的世界,我想这对你来说可能显得非常混乱。但对于那些来自Perl或Javascript世界的人(或者从另一个方向,比如Scheme或Haskell),这其实是相当优雅的。

所以基本上,我想说的答案是“为什么不呢?” :)

10

PEP 232 里有很多关于这个话题的详细讨论,你可以去看看。

撰写回答