在Python中,使用def
和lambda
创建的函数具有__dict__
属性,因此您可以动态地向其添加属性。每个函数都有__dict__
会产生内存成本。空dict
在CPython 2.6中使用140个字节。
向函数添加属性并不是特别常见的事情,并且您可以在需要具有非标准属性的函数的情况下使用带有__call__
方法的自定义对象。
由于向函数添加自定义属性不是常见用例并且__dict__
具有内存成本,为什么Python函数具有__dict__
?
答案 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)