首页 > 后端开发 > Python教程 > 为什么 Python 方法不相等,即使它们引用相同的底层函数?

为什么 Python 方法不相等,即使它们引用相同的底层函数?

Barbara Streisand
发布: 2024-10-29 04:59:29
原创
910 人浏览过

 Why are Python Methods Not Equal, Even if They Refer to the Same Underlying Function?

Python 中的方法引用相等性

在 Python 中,方法是在访问时动态创建的唯一对象。此行为与常规函数不同,常规函数无论何时调用,都会被同一对象引用。

要理解这一点,请考虑以下示例:

class What:
    def meth(self):
        pass
What().meth is What().meth  # False
登录后复制

在此代码中,尽管引用相同的底层函数,但 meth 方法并不相等。这是因为每个 meth 对象都是在运行时创建的唯一实例。

这种行为的原因在于 Python 的属性查找过程,其中通过调用描述符的 (function) .__get__ 方法来生成方法对象:

What.__dict__['meth'].__get__(What(), What)
登录后复制

方法对象的动态创建导致以下观察结果:

  • 同一类的实例具有不同的方法对象:

    inst = What()
    inst.meth is inst.meth  # False
    登录后复制
  • 不同类中的方法始终是不同的对象:

    What.meth is Other.meth  # False
    登录后复制

在 Python 3.8 之前,测试使用 == 的方法相等可能会产生不一致的结果。但是,Python 3.8 及更高版本允许基于 .___self__ 和 .___func__ 属性对方法进行相等比较(如果它们匹配相同)。

作为最佳实践,要确定两个方法是否表示相同的基础函数,请比较他们的 .__func__ 属性:

What.meth.__func__ == What.meth.__func__  # True
What().meth.__func__ == What().meth.__func__  # True (for same instance)
What().meth.__func__ == What(other_instance).meth.__func__  # False (for different instances)
登录后复制

以上是为什么 Python 方法不相等,即使它们引用相同的底层函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板