Python 类方法的标识

Python 类方法的标识,python,Python,鉴于班级: 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) 正确吗 classmethoddecorator将方

鉴于班级:

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)

正确吗

classmethoddecorator将方法包装在描述符中。
MyClass.my_class_方法
与code
MyClass.my_dict_['my_class_方法']。\u获取(无,MyClass)
\uuuu get\uuuu
为每个调用返回一个不同的绑定方法包装器,因此这两个方法是不同的对象,
is
失败

CPython中的,因为
id
是基于对象所在的地址计算的;当计算第一个绑定方法包装器的
id
时,该包装器上的引用计数减少,包装器被释放;偶然的情况下,第二个将被分配到完全相同的地址<代码>id(obj)保证仅对当前的每个活体对象是不同的


在Python 2中,前者同样适用于未绑定的方法:

>>> class MyClass():   
...     def x(self):
...         pass
... 
>>> MyClass.x
<unbound method MyClass.x>
>>> MyClass.x is MyClass.x
False
>>类MyClass():
...     def x(自我):
...         通过
... 
>>>MyClass.x
>>>x是MyClass.x
假的
在Python3中,未绑定的方法语义发生了更改,现在

>>> class MyClass():   
...    def x(self):
...        pass
...
>>> MyClass.x
<function __main__.x>
>>> MyClass.x is MyClass.x
True
>>类MyClass():
...    def x(自我):
...        通过
...
>>>MyClass.x
>>>x是MyClass.x
真的

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

我不确定这是否真的是引用问题的重复。我知道两个独立创建的空列表不是同一个对象。然而,在此示例中,
type
实例
MyClass
是相同的对象(
MyClass是MyClass
True
)。为什么它的绑定方法
my_class\u method
不成立?@Ashwini Chaudhary我可能还不够努力。。。但是翻看你的复制件,我还是觉得情况不同。请注意,在这个场景中,OP总是使用相同的对象,
MyClass.my_class\u方法
,因此它不同于执行
(id({})=id({}))
的情况。第二个示例将返回
True
,这非常合理。所以真正的问题(在你的链接副本中没有得到真正的回答)是为什么
操作符没有像
id()
@Eithos
MyClass一样返回
True
。我的class\u方法
不是同一个对象,每次调用类方法或实例方法实际上都会返回一个新的包装器。@AshwiniChaudhary实际上这也是我的想法。我对其背后的逻辑并不完全陌生。但是试试这个:
def getID(obj):objID=id(obj)print objID return objID
,然后,
print getID(MyClass.my_class_方法)就是getID(MyClass.my_class_方法)
这里的输出非常奇怪的是我得到了类似于
34298328 34298328 False
。在这种情况下,当获取的id相同时,
is
操作符怎么可能不返回
True
?有些事情告诉我,我可能看不到我面前显而易见的东西;P@EithosFrom page:注意,每次从类或实例检索属性时,都会发生从函数对象到(未绑定或绑定)方法对象的转换。