a == b是假的,但是id(a)== id(b)是真的吗?

时间:2010-02-23 15:03:18

标签: python object methods override

进入以下目的:

>>> class A:
...     def __str__(self):
...             return "some A()"
... 
>>> class B(A):
...     def __str__(self):
...             return "some B()"
... 
>>> print A()
some A()
>>> print B()
some B()
>>> A.__str__ == B.__str__
False # seems reasonable, since each method is an object
>>> id(A.__str__)==id(B.__str__)
True # what?!

这里发生了什么?

3 个答案:

答案 0 :(得分:11)

在评估字符串id(A.__str__) == id(B.__str__)时,会创建A.__str__,获取其ID,然后进行垃圾回收。然后创建B.__str__,并且恰好在A.__str__之前的完全相同的地址处结束,因此它(在CPython中)得到相同的id。

尝试将A.__str__B.__str__分配给临时变量,您会看到不同的内容:

>>> f = A.__str__
>>> g = B.__str__
>>> id(f) == id(g)
False

有关此现象的更简单示例,请尝试:

>>> id(float('3.0')) == id(float('4.0'))
True

答案 1 :(得分:8)

以下作品:

>>> id(A.__str__.im_func) == id(A.__str__.im_func)
True
>>> id(B.__str__.im_func) == id(A.__str__.im_func)
False

答案 2 :(得分:0)

对于我们这些被你的头衔吸引的人来说,确定一种方法是否被覆盖:

class A:
    def __str__(self):
        return "some A()"

    def strWasOverridden(self):
        return A.__str__ != self.__str__