进入以下目的:
>>> 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?!
这里发生了什么?
答案 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__