问个关于 python 的 function 的问题

2015-02-15 13:54:16 +08:00
 tywtyw2002
最近看到一段代码就产生了疑问python中function是以什么形式的存在呢?
class?
代码如下

def test():
pass

test.a = 100
test.b = 200

居然还可以给function赋值? 这个不是之前class的功能吗???

dir(test) 之后发现返回的是一个list

求指导。
2903 次点击
所在节点    Python
8 条回复
9hills
2015-02-15 13:55:42 +08:00
Python一切皆对象。function 也不例外
9hills
2015-02-15 13:57:20 +08:00
http://woodpecker.org.cn/diveintopython/getting_to_know_python/everything_is_an_object.html

比如所有函数都有 __doc__ 这个属性,你也可以增加新的属性上去。而且访问函数的属性不会执行函数
icedx
2015-02-15 13:58:00 +08:00
貌似Fuction 也是一个对象...

不过dir() 返回的必然是List 吧...
我觉得你想要的是type()
tywtyw2002
2015-02-15 14:03:06 +08:00
@icedx 我就是感觉 居然一个function 还能用func.xx的方式去赋值。。。。
jiang42
2015-02-15 14:37:03 +08:00
@tywtyw2002 syntax都是虚的。。。还是得理解内在的东西啊

C++我也能写出函数对象来。。。也可以用func.xx去赋值
ruoyu0088
2015-02-15 15:08:19 +08:00
所有的Python对象在C语言里面都是一个结构体。这个结构体的第二个字段指向表示这个对象的类型。例如函数a是一个结构体,它的第二个字段指向function这个对象。function对象里面定义了如何存取函数对象的__dict__属性:

https://github.com/python/cpython/blob/c7688b44387d116522ff53c0927169db45969f0e/Objects/funcobject.c#L434

读取__dict__属性时实际上调用如下的函数PyObject_GenericGetDict():

https://github.com/python/cpython/blob/347107218fd0ca2ba0bcfe97280ec17e902cf8c6/Objects/dictobject.c#L3797

看这个函数你就知道,function对象支持__dict__,但是只有在你第一次使用它时才会创建这个字典,所以不必担心每个函数都带一个不必要的字典对象,增加内存使用量。
Melodic
2015-02-15 16:24:36 +08:00
Python中函数的地位比类牛×多了
icedx
2015-02-15 16:30:32 +08:00
@tywtyw2002 其实就是类 建议去阅读源码

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/171131

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX