Python 中的方法相等性:解开引用不等式之谜
在 Python 中,方法和函数表现出一个奇怪的区别:而函数表现出引用相等性,方法没有。这可能会导致意外的错误,特别是在依赖 is 运算符来比较方法时。
为什么引用相等性会避开方法
与作为静态实体的函数不同,方法对象每次被访问时都会动态创建。这是因为方法充当描述符,在调用其 .__get__ 方法时返回一个新的方法对象。例如,在提供的示例中:
class What: def meth(self): pass
赋值 What.meth 返回一个函数对象,该对象与稍后调用 inst.meth 时创建的绑定方法对象不同。这解释了为什么 What.meth 是 What.meth 的计算结果为 False。
Python 3.8 中的相等
在 Python 3.8 及更高版本中,可以使用替代方法:使用 == 进行相等性测试。如果两个方法的 .__self__ 和 .__func__ 属性是相同的对象,则认为它们是相等的,这表明它们包装相同的函数并绑定到相同的实例。
对于函数 __ 和 未绑定方法
无论 Python 版本如何,函数和未绑定方法(在 Python 2 中)都可以使用 is 运算符进行比较,因为它们都表示相同的底层函数引用。
底层函数测试
如果需要检查两个方法是否代表同一个底层函数,可以比较 .__func__ 属性:
if What().meth.__func__ == What().meth.__func__: print("Methods represent the same function")
此方法为方法和函数提供一致且可靠的相等性检查,无论其绑定状态或 Python 版本如何。
以上是为什么 Python 中的 is 无法比较方法,但可以用于函数?的详细内容。更多信息请关注PHP中文网其他相关文章!