为什么python函数有一个__dict__?

时间:2011-09-16 00:41:30

标签: python

在Python中,使用deflambda创建的函数具有__dict__属性,因此您可以动态地向其添加属性。每个函数都有__dict__会产生内存成本。空dict在CPython 2.6中使用140个字节。

向函数添加属性并不是特别常见的事情,并且您可以在需要具有非标准属性的函数的情况下使用带有__call__方法的自定义对象。

由于向函数添加自定义属性不是常见用例并且__dict__具有内存成本,为什么Python函数具有__dict__

3 个答案:

答案 0 :(得分:10)

PEP 232对此有广泛的讨论,你可能想看看。

答案 1 :(得分:6)

  

在Python中,使用def和lambda创建的函数具有__dict__属性,因此您可以动态地向它们添加属性。

嗯,是的;毕竟,它们是对象。

  

每个函数都有__dict__会产生内存成本。空的dict在CPython 2.6中使用140个字节。

对我来说这是124个字节。并不是说为了讨论真的很重要。

如果你真的需要保存每个字节,你就不会使用Python。在使用大量内存的程序中,函数通常只占对象数量的一小部分,因此开销并不重要。 IMO你应该更担心的是,每个浮点值花费你16个字节,你不能从double切换到float。当然,担心这个的方法是使用Numpy。 :)

  

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

如果你来自Java / C ++ / C#世界,那么我认为它对你来说似乎非常麻烦。但是对于那些来自Perl / Javascript世界的人(或者甚至是一个非常不同的方向,可能是像Scheme或Haskell这样的东西),它非常优雅。

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

答案 2 :(得分:3)

如果您不需要空dict,则该dict不存在,以下是检查它的代码:

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