codetalks-new / notes

About me
4 stars 0 forks source link

流畅的 Python 第一章 数据模型 学习笔记 #1

Open codetalks-new opened 5 years ago

codetalks-new commented 5 years ago

简介

双下划线方法,又叫特殊方法、魔法方法或者 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__ 来调用父类的构造器。

codetalks-new commented 5 years ago

字符串表示形式 reprstr

可以参考。https://stackoverflow.com/questions/1436703/difference-between-str-and-repr 显然 __repr__ 会用于被内置函数 __repr__ 调用的。交互式控制程序如 Python 控制台及 IPython 就会调用 repr 函数来获取字符串表示形式。 __str__ 则用于被内置函数 str 调用。用在 print 函数打印时调用并且对用户更友好。 当 Python 解释器需要调用__str__ 时而此对象又没有 __str__ 时,它会调用 __repr__