未重载==运算符的类的实例对象值如何定义?
Python对象的标识、类型与值的定义探讨
来自Python参考文档:
每个对象都有标识、类型和值。
比较运算符实现了对对象值的特定定义。可以认为它们通过比较实现间接定义了对象的值。
Luciano Ramalho在其著作《流畅的Python》第二版第206页中提到:
运算符
==比较对象的值(它们存储的数据),而is比较对象的标识。
基于此,我总结出一种可行的对象值定义(也是官方参考文档隐含的严谨无细节定义):对象的值是该对象的__eq__()方法所使用的数据。但问题来了——有些类并未重写__eq__()方法,这类类的实例对象的值该如何定义?
(注:我并非寻求绝对严格的定义,因为这类定义可能并不存在。我需要的是比“对象的值是其代表的信息”更实用的解释——这句话没错,但过于抽象,实用性不强。)
举个例子,假设我们有一个函数f,它是内置function类的实例。该类未重写__eq__()方法,因此此时==运算符仅比较操作数的标识(当两个操作数均为函数时)。但显然不能说对象f的值等同于其标识:有观点认为用户自定义函数是可变对象,即可以修改其值,但任何对象的标识都无法被修改。因此f的值不等于id(f),它需要另一种定义方式,我希望能得到适用于CPython的恰当定义。
我曾看到过关于函数对象值的定义:
它的“值”是一组其他值,这些值足以定义完全相同的函数。
但我不确定这是否属于“标准”定义。
内容的提问来源于stack exchange,提问作者Rodvi
相关产品推荐
相关产品推荐

