最近在看Luke Sneeringer的 "Professional Python" 这本书,做一些关于这本书的笔记。
首先是魔术方法,本书的第二部分,第四章。为什么不按顺序来呢,我也不知道。
0. 什么是魔术方法
简单地说,就是在面向对象编程时,编写的一些对于特定操作(例如特定函数、操作符)做出特定响应的函数(作者称之为“钩子”)。
对于魔术方法,遵循统一的格式:双下划线在函数名两端,例如常见的__init__,可以读作“dunder init”。
1. 常用的魔术方法
(1)__init__
在类的实例被创建时立即执行,必须要有参数self,没有也不能有返回值(否则会报错TypeError)。
例如:
class MyClass:
def __init__(self):
print("You create an object.")
cls = MyClass()
输出:
You create an object.
其实__init__更多被运用于为初始化对象赋值,但该方法并不创建对象(由__new__方法创建对象)。其作用很像C++中的构造函数。
(2)__new__
__new__的应用场景相对来说少一些,简单地说,其主要运用于想要继承一些不可变的自带类(如tuple、str、int等等)时,需要改写父类的__new__方法。
两个例子:
编写一个类,永远返回一个非负整数:
class PositiveInt(int):
def __new__(cls, val):
return super(PositiveInt, cls).__new__(cls, abs(val))
编写一个类,永远返回一个大写字母串:
class UpperStr(str):
def __new__(cls, s):
return super(UpperStr, cls).__new__(cls, s.upper())
此外,__new__方法还能用于实现单例(Singleton)和元类(MetaClass)