基本概念
在Python的类中,以两个下划线开头、两个下划线结尾的方法,如常见的 :init、str、del等,就被称为「魔术方法」(Magic methods)。魔术方法在类或对象的某些事件出发后会自动执行,如果希望根据自己的程序定制特殊功能的类,那么就需要对这些方法进行重写。使用这些「魔法方法」,我们可以非常方便地给类添加特殊的功能。
分类
- 构造与初始化
- 类的表示
- 访问控制
- 比较操作
- 容器类操作
- 可调用对象
- 序列化
构造与初始化
1. new()
- new(cls, […]) 是在一个对象实例化的时候所调用的第一个方法,所以它才是真正意义上的构造方法。
- 它的第一个参数是这个类,其他的参数是用来直接传递给 init 方法。
- new 决定是否要使用该 init 方法,因为 new 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 new 没有返回实例对象,则 init 不会被调用。
- new 主要是用于继承一个不可变的类型比如一个 tuple 或者 string。
1 | class Person(object): |
2. init()
init()方法:构造器,当一个实例被创建的时候调用的初始化方法。
1 | class Person(object): |
3. del()
del()方法:析构器,当一个实例被销毁时自动调用的方法。
1 | class Washer: |
类的表示
1. str() 和repr()
repr的结果是让解释器用的,str的结果是让人看的
1 | class Washer: |
3. bool()
当调用 bool(obj) 时,会调用 bool() 方法,返回 True 或 False
1 | class Person(object): |
访问控制
- setattr:定义当一个属性被设置时的行为
- getattr:定义当用户试图获取一个不存在的属性时的行为
- delattr:删除某个属性时调用
- getattribute:访问任意属性或方法时调用
1 | class Person(object): |
容器类操作
容器类的魔法方法,主要包括:
setitem(self, key, value):定义设置容器中指定元素的行为,相当于 self[key] = value;
getitem(self, key): 定义获取容器中指定元素的行为,相当于 self[key];
delitem(self, key):定义删除容器中指定元素的行为,相当于 del self[key];
len(self):定义当被 len() 调用时的行为(返回容器中元素的个数);
iter(self):定义当迭代容器中的元素的行为;
contains(self, item):定义当使用成员测试运算符(in 或 not in)时的行为;
reversed(self):定义当被 reversed() 调用时的行为。
1 | class MyList(object): |
可调用对象
在Python中,方法也是一种高等的对象。这意味着他们也可以像其他对象一样被传递到方法中,这是一个非常惊人的特性。 Python中有一个特殊的魔术方法可以让类的实例的行为表现的像函数一样,你可以调用他们,将一个函数当做一个参数传到另外一个函数中等等。这个魔法方法就是 call(self, [args…])。
1 | class Circle(object): |
序列化
getstate()
setstate()
1 | import pickle |