魔术方法不过是一种特殊的方法,它不需要人工调用,在特定的时刻会自动执行。
比如像a-b
其实"魔术"般地执行了a.__sub__(b)
,像__sub__
这样的以"__"双下划线包起来的方法,都统称魔术方法。
魔术方法的分类
魔法方法大致可以分为两类:与运算符相关以及与运算符无关的,而两大类下还有很多小类
1、与运算符相关的魔术方法很简单,即触发条件为运算符
2、而与运算符无关的才是我们需要着重关心的地方,也就是说以下才是你能秀起来的魔术方法
实例创建和销毁
- Python中构造一个实例其实分为两步:
__new__
用来创建类并返回这个类的实例, 然后__init__
将传入的参数来初始化该实例,可以说这两个方法共同构成了"构造函数"
1、__init__
通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后,所以不需要返回值。它是实例级别的方法。
2、__new__
通常用于控制生成一个新实例的过程,所以必须要有返回值。它是类级别的方法
使用__new__
和__init__
来实现单例模式:
import threading
class Singleton(object):
_instance_lock = threading.Lock()
#初始化实例
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
#创建类实例
def __new__(cls, arg1, arg2):
with Singleton._instance_lock:
if not hasattr(Singleton, "_instance"):
#由于重写了__new__所以要调用父类的方法达到原本的效果
Singleton._instance = object.__new__(cls)
return Singleton._instance
obj1 = Singleton