object.__str__ 和 object.__repr__ 有什么作用?警告:它与 Class.__str__ 和 Class.__repr__ 不同
What does object.__str__ and object.__repr__ do? Warning: It's not the same as Class.__str__ and Class.__repr__
class TestClass:
def __init__(self):
pass
def __str__(self):
return 'You have called __str__'
def __repr__(self):
return 'You have called __repr__'
a = TestClass()
print(object.__repr__(a))
print(object.__str__(a))
输出:
<__main__.TestClass object at 0x7fe175c547c0>
You have called __repr__
这两个函数有什么作用?
我的理解是调用str(a)
returnsa.__str__()
和调用repr(a)
returnsa.__repr__()
。 print(a)
还打印字符串 a.__str__()
因为正在进行隐式 str(a)
转换。
请注意,我的问题与另一个热门问题不重复;请参阅下面我的第一条评论。
该行为违反直觉;做 print(object.__str__(a))
打印 repr 字符串而不是 str 字符串。
object
class 为 __repr__
和 __str__
方法提供默认实现。
object.__repr__
显示对象的类型及其id
(对象在C中的地址Python)
object.__str__(a)
呼叫 repr(a)
。基本原理是,如果 __str__
未在 class 中被覆盖,str(a)
将自动调用 repr(a)
, 使用可能的覆盖 __repr__
。更确切地说,Python 语言参考/数据模型/特殊方法名称/基本定制的官方文档说:
object.__str__(self)
...The default implementation defined by the built-in type object calls object.__repr__()
.
... 进而调用重写的 __repr__
方法,就像 repr(object)
那样。
这正是此处发生的情况,因为您直接调用 object.__str__
而这不是预期的。
class TestClass:
def __init__(self):
pass
def __str__(self):
return 'You have called __str__'
def __repr__(self):
return 'You have called __repr__'
a = TestClass()
print(object.__repr__(a))
print(object.__str__(a))
输出:
<__main__.TestClass object at 0x7fe175c547c0>
You have called __repr__
这两个函数有什么作用?
我的理解是调用str(a)
returnsa.__str__()
和调用repr(a)
returnsa.__repr__()
。 print(a)
还打印字符串 a.__str__()
因为正在进行隐式 str(a)
转换。
请注意,我的问题与另一个热门问题不重复;请参阅下面我的第一条评论。
该行为违反直觉;做 print(object.__str__(a))
打印 repr 字符串而不是 str 字符串。
object
class 为 __repr__
和 __str__
方法提供默认实现。
object.__repr__
显示对象的类型及其id
(对象在C中的地址Python)object.__str__(a)
呼叫repr(a)
。基本原理是,如果__str__
未在 class 中被覆盖,str(a)
将自动调用repr(a)
, 使用可能的覆盖__repr__
。更确切地说,Python 语言参考/数据模型/特殊方法名称/基本定制的官方文档说:object.__str__(self)
...The default implementation defined by the built-in type object calls
object.__repr__()
.... 进而调用重写的
__repr__
方法,就像repr(object)
那样。
这正是此处发生的情况,因为您直接调用 object.__str__
而这不是预期的。