>>> 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'>
A类到子类列表没有充分的理由,我只是想表明类型不同.
解决方法 区别在于内置输入是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'>
看到:
> What is a wrapper_descriptor,and why is Foo.__init__
one in this case
> What is the __dict__.__dict__
attribute of a Python class?
以上是内存溢出为你收集整理的python – 内置类型和用户定义之间的不一致全部内容,希望文章能够帮你解决python – 内置类型和用户定义之间的不一致所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)