在阅读unification of types时,我偶然发现内置类型包含method_descriptor
和builtin_function_or_method
而不是method
和function
这一事实s,为什么?
>>> list.append
<method 'append' of 'list' objects>
>>> type(list.append)
<class 'method_descriptor'>
>>> [].append
<built-in method append of list object at 0x7f0c4214aef0>
>>> type([].append)
<class 'builtin_function_or_method'>
>>> class A(list):
... def append(self): pass
...
>>> A.append
<function A.append at 0x7f0c42168dd0>
>>> type(A.append)
<class 'function'>
>>> A().append
<bound method A.append of []>
>>> type(A().append)
<class 'method'>
class A
没有充分理由将列表列为子类,我只想表明类型不同。
答案 0 :(得分:3)
区别在于内置输入是C编译的代码描述符,而用户定义的函数代表了代码descriptors。有关详细信息,请参阅source。
此外,虽然内置函数及其方法是静态分配的数据结构,但用户定义的数据结构的内存是以动态方式分配的。甚至大小也不同:描述符的大小在内置函数和类似的用户定义之间是相等的,参考C源(上面的链接):
>>> sys.getsizeof(list.append)
72 # built-in
>>> sys.getsizeof(dir)
72 # built-in
>>> sys.getsizeof(A.__init__)
80 # class/instance method
>>> sys.getsizeof(lambda x: x)
120 # static function
所以那些东西看起来不同,居住在不同的地方,表现不同。没有必要给他们相同的名字。
我想为classmethod
,classmethod_descriptor
,
>>> type(float.__dict__['fromhex'])
<type 'classmethod_descriptor'>
以及其他一些有趣的类型:
>>> type(A.__init__)
<type 'wrapper_descriptor'>
>>> type(A.__dict__['__dict__'])
<type 'getset_descriptor'>
见: