首页  >  文章  >  后端开发  >  为什么 Python 中的 is 无法比较方法,但可以用于函数?

为什么 Python 中的 is 无法比较方法,但可以用于函数?

Barbara Streisand
Barbara Streisand原创
2024-11-02 18:35:03495浏览

  Why Does `is` Fail to Compare Methods in Python, But Works for Functions?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn