class T():
...
t = T()
t.__str__ = types.MethodType(lambda self: "qqqqqq", t)
print(t) # default object.__repr__С你向我解释了这种行为的原因。也许有什么解决办法?
发布于 2022-02-01 23:37:03
str(t)调用t.__class__.__str__(t),而不是t.__str__()
class T:
pass
t = T()
t.__str__ = lambda: "foo"
print(t) # <__main__.T object at 0x000001FA84DA7D60>
print(t.__str__()) # foo
T.__str__ = lambda self: "foo"
print(t) # foo这是因为特殊的方法对于如何查找它们有特殊的规则:
https://docs.python.org/3/reference/datamodel.html#special-method-lookup
对于自定义类,只有在对象的类型上定义而不是在对象的实例字典中定义时,才能保证特殊方法的隐式调用正确工作。
通常,解决方案是在实际的类中定义__str__,并根据需要通过类属性通知其实现,而不是在单个实例中对整个方法进行猴子修补:
class T:
def __str__(self):
return "foo"
t = T()
print(t) # foohttps://stackoverflow.com/questions/70948957
复制相似问题