为什么方法不表现出引用相等性?
在 Python 中,虽然函数保持引用相等性,但方法却不然。这种差异源于方法的创建方式。
方法创建
与函数不同,方法对象在每次访问时都会被实例化。这是因为方法本质上是描述符,当调用 .__get__ 方法时,它们会返回一个方法对象。
What.__dict__['meth'] # Function (not method) object What.__dict__['meth'].__get__(What(), What) # Method object
方法相等性测试
在 Python 3.8 及更高版本中,方法相等性是通过比较 .__self__ 和 .__func__ 属性来确定的。如果它们引用相同的函数和实例,则这些方法被认为是相等的。然而,在 3.8 之前,方法相等性行为根据方法的实现而不一致。
含义
方法相等性的这种变化会影响多种场景:
测试函数同一性的解决方案
要测试方法是否代表相同的底层函数,您可以可以比较它们的 .__func__ 属性:
What().meth.__func__ == What().meth.__func__
以上是为什么 Python 中的方法不表现出引用相等性?的详细内容。更多信息请关注PHP中文网其他相关文章!