gpt4 book ai didi

python - 类方法的同一性

转载 作者:行者123 更新时间:2023-12-01 04:48:59 25 4
gpt4 key购买 nike

给定类(class):

class MyClass(object):
@classmethod
def my_class_method(cls):
return None

为什么

MyClass.my_class_method is MyClass.my_class_method

评估为False,而此

id(MyClass.my_class_method) == id(MyClass.my_class_method)

吗?

最佳答案

classmethod 装饰器将方法包装在描述符中。MyClass.my_class_method 与代码 MyClass.__dict__['my_class_method'].__get__(None, MyClass); 的作用相同。 __get__ 为每次调用返回一个不同的绑定(bind)方法包装器,因此这两个是不同的对象,is 失败。

id being the same is just a (common) coincidence ,因为CPython中的id是根据对象所在的地址计算的;当计算出第一个绑定(bind)方法包装器的id时,减少该包装器的引用计数并释放该包装器;碰巧第二个将被分配在完全相同的地址。 id(obj) 保证仅对于每个当前事件的对象是不同的。

<小时/>

在 Python 2 中,前者对于未绑定(bind)方法也适用:

>>> class MyClass():   
... def x(self):
... pass
...
>>> MyClass.x
<unbound method MyClass.x>
>>> MyClass.x is MyClass.x
False

在 Python 3 中,未绑定(bind)方法语义已更改,现在

>>> class MyClass():   
... def x(self):
... pass
...
>>> MyClass.x
<function __main__.x>
>>> MyClass.x is MyClass.x
True

未绑定(bind)的实例方法是 Python 3 中的裸函数,每次查找都会生成相同的对象。

关于python - 类方法的同一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com