为什么Python函数有__dict__?
在Python中,用 def
和 lambda
创建的函数都有一个叫 __dict__
的属性,这样你就可以动态地给它们添加属性。不过,每个函数都有一个 __dict__
是要占用内存的。在CPython 2.6中,一个空的 dict
就要占用140个字节。
给函数添加属性并不是特别常见的做法,如果你确实需要一个带有特殊属性的函数,可以使用一个自定义对象,并且这个对象要有一个 __call__
方法。
既然给函数添加自定义属性并不常见,而且 __dict__
还要占用内存,那为什么Python的函数还要有 __dict__
呢?
3 个回答
如果你不需要一个空字典,它就不存在。下面是用来检查这个的代码:
import gc
f = lambda :1
print {} in gc.get_referents(f)
f.__dict__
print {} in gc.get_referents(f)
在Python中,用def和lambda创建的函数都有一个叫做
__dict__
的属性,这样你就可以动态地给它们添加属性。
没错,毕竟它们都是对象。
每个函数都有一个
__dict__
,这会占用一些内存。在CPython 2.6中,一个空的字典大约需要140个字节。
对我来说是124个字节。其实这对讨论来说并不太重要。
如果你真的想节省每一个字节,那你就不会用Python了。在一个使用大量内存的程序中,函数通常只占用很小的一部分对象,所以这点额外的内存开销其实并不算什么。在我看来,你更应该担心的是每个浮点值要花费16个字节,而且你不能从double
切换到float
。当然,解决这个问题的方法是使用Numpy。:)
给函数添加属性并不是特别常见的事情。
如果你来自Java、C++或C#的世界,我想这对你来说可能显得非常混乱。但对于那些来自Perl或Javascript世界的人(或者从另一个方向,比如Scheme或Haskell),这其实是相当优雅的。
所以基本上,我想说的答案是“为什么不呢?” :)
PEP 232 里有很多关于这个话题的详细讨论,你可以去看看。