Open codetalks-new opened 5 years ago
可以参考。https://stackoverflow.com/questions/1436703/difference-between-str-and-repr
显然 __repr__
会用于被内置函数 __repr__
调用的。交互式控制程序如 Python 控制台及 IPython 就会调用 repr
函数来获取字符串表示形式。
__str__
则用于被内置函数 str
调用。用在 print
函数打印时调用并且对用户更友好。
当 Python 解释器需要调用__str__
时而此对象又没有 __str__
时,它会调用 __repr__
简介
双下划线方法,又叫特殊方法、魔法方法或者 dunder method.
Python 解释器在遇到一些特殊的句法时,会使用特殊方法去激活一些基本的对象操作。这些特殊方法能让你自己的对象实现和支持如下的语言结构,并与之交互。
迭代 集合类 属性访问 运算符重载 函数和方法的调用 对象的创建和销毁 字符串表示形式和格式化 管理上下文(即 with 块)
用法
特殊方法的存在是为了被 Python 解释器调用的,你自己并不需要调用它们。也就是说没有
my_object.__len__()
这种写法,而应该使用len(my_object)
, 在执行len(my_object)
的时候,如果my_object
是一个自定义类的对象,那么 Python 会自己去调用其中由你实现的__len__
方法。对于内置类型 CPython 实际上会直接返回
PyVarObject
里的ob_size
属性。PyVarObject
是表示内存中长度可变的内置对象的 C 语言结构体。很多时候特殊方法的调用是隐式的,比如
for i in x:
这个语句,背后其实用的是iter(x)
,而这个函数的背后则是x.__iter__()
方法。通常我们不需要直接使用特殊方法(除非有大量元编程存在),有一个例外是
__init__
方法,通过需要调用__init__
来调用父类的构造器。