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_方法
与codeMyClass.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()
@EithosMyClass一样返回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:注意,每次从类或实例检索属性时,都会发生从函数对象到(未绑定或绑定)方法对象的转换。