为何`SomeClass.method is SomeClass.method`结果为False?Python方法解析
关于Python类方法引用的
is与==结果差异解答 首先,你观察到的现象完全合理——当你直接引用类的方法(比如SomeClass.a_method)时,Python确实每次都会生成一个新的未绑定方法对象(unbound method object),这就是示例1中SomeClass.a_method is SomeClass.a_method返回False的核心原因。
具体原因拆解:
- 当你访问类的方法属性时,Python不会直接返回你定义的原始函数对象,而是会动态创建一个
method对象来包装这个函数。每次你访问SomeClass.a_method,都会生成一个全新的包装实例,它们的内存地址完全不同,而is运算符是用来检查两个对象是否是同一个(即内存地址相同),所以结果自然是False。 - 而
==比较返回True,是因为method对象的相等性判断逻辑是基于底层的函数对象和所属类:只要两个方法对象包装的是同一个原始函数,并且属于同一个类,就会被判定为相等,和它们是不是同一个实例无关。
结合其他示例辅助理解:
- 示例3中,
SomeClass().a_method is SomeClass().a_method返回False,是因为每个实例的方法都是绑定方法对象(bound method object),每个绑定方法都关联着特定的实例,每次访问都会生成新的绑定方法实例,身份自然不同。 - 示例4返回False,则是因为绑定方法的相等性判断还会考虑绑定的实例:两个不同实例的绑定方法,哪怕底层函数相同,也会因为绑定的实例不一样而被判定为不相等。
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

