
1、什么是魔法方法?
魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动触发的。它们经常是两个下划线包围来命名的(比如 __init__,__lt__),Python的魔法方法是非常强大的,所以了解其使用方法也变得尤为重要!
2、__init__(self[, ...]),__new__(cls[, ...]),__del__(self)
(1)__init__ 构造器,当一个实例被创建的时候初始化的方法。但是它并不是实例化调用的第一个方法,__new__才是实例化对象调用的第一个方法,它只取下 cls 参数,并把其他参数传给 __init__。 __new__很少使用,但是也有它适合的场景,尤其是当类继承自一个像元组或者字符串这样不经常改变的类型的时候。
(2)__new__ 使用时注意以下四点:
a、__new__ 是在一个对象实例化的时候所调用的第一个方法;
b、它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法;
c、__new__ 返回一个构建的实例;
d、__new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则__init__ 不会被调用;
e、__new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string。
相关推荐:《Python平台》
__new__实现单例模式(无论多少次实例化,结果都是同一个实例)
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
(3)__del__ 析构器,当实例被销毁时调用。
3、__call__(self[,args ...]),__getitem__(self,key),__setitem__(self,key,value)
(1)__call__ 允许一个类的实例像函数一样被调用,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
(2)__getitem__ 定义获取容器中指定元素的行为,相当于self[key],如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
(3)__setitem__ 设置容器中指定元素的行为,相当于self[key] = value 。
4、__getattr__(self,name),__getattribute__(self,name),__setattr__(self,name,value),__delattr__(self,name)
(1)__getattr__ ():当用户试图访问一个不存在属性时触发;
(2)__getattribute__(): 当一个属性(无论存在与否)被访问时触发;
(3)__setattr__ ():当一个属性被设置时触发;
(4)__delattr__ ():当一个属性被删除时触发。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|