这篇文章将为大家详细讲解有关python中的魔法方法如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
<强> 1,什么是魔法方法? 强>
魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重)载了这些方法中的某一个,那么这个方法就会在特殊的情况下被python所调用,你可以定义自己想要的行为,而这一切都是自动触发的。它们经常是两个下划线包围来命名的(比如__init__, __lt__), python的魔法方法是非常强大的,所以了解其使用方法也变得尤为重要。
<强> 2,__init__(自我[…]),__new__ (cls […]), __del__(自我)强>
(1) __init__构造器,当一个实例被创建的时候初始化的方法。但是它并不是实例化调用的第一个方法,__new__才是实例化对象调用的第一个方法,它只取下cls参数,并把其他参数传给__init__ . __new__很少使用,但是也有它适合的场景,尤其是当类继承自一个像元组或者字符串这样不经常改变的类型的时候。
(2) __new__使用时注意以下四点:
, __new__ 是在一个对象实例化的时候所调用的第一个方法;
b,它的第一个参数是这个类,其他的参数是用来直接传递给__init__方法;
c, __new__ 返回一个构建的实例;
d, __new__ 决定是否要使用该__init__方法,因为__new__可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果__new__没有返回实例对象,则__init__不会被调用;
e, __new__ 主要是用于继承一个不可变的类型比如一个元组或者字符串。
<强> __new__实现单例模式(无论多少次实例化,结果都是同一个实例)强>
单例模式(单例模式)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个AppConfig的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建AppConfig对象的实例,这就导致系统中存在多个AppConfig的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似AppConfig这样的类,我们希望在程序运行期间只存在一个实例对象。
举例:
class 人(对象): def 才能;__init__(自我,,名字,,年龄): ,,,self.name =,名字 ,,,self.age =,年龄 def 才能__new__ (cls, * args,, * * kwargs): ,,,if not hasattr (cls, & # 39;实例# 39;): ,,,,,cls.instance =,超级(). __new__ (cls) ,,,return cls.instance 时间=a 人(& # 39;p1 # 39;, 21) 时间=b 人(& # 39;p2 # 39;, 22) 打印(a ==, b,, a.name ==, b.name),,,, #,这里的打印结果都是真的,可见,a 和,b 都是同一个实例(实例,b 覆盖了实例,a)。 #,单例作用: #第才能一、控制资源的使用,通过线程同步来控制资源的并发访问; #第才能二,控制实例产生的数量,达到节约资源的目的。 #第才能三,作为通信媒介使用,也就是数据共享。比如,数据库连接池的设计一般采用单例模式,数据库连接是一种数据库资源。 #,应用场景: # Python的记录器就才能是一个单例模式,用以日志记录 #线才能程池,数据库连接池等资源池一般也用单例模式 #才能Windows的资源管理器是一个单例模式 #网才能站计数器
(3) __del__析构器,当实例被销毁时调用。
<强> 3,__call__(自我(args…)), __getitem__(自我,键),__setitem__(自我、关键值)强>
(1) __call__允许一个类的实例像函数一样被调用,如下:
class 人(对象): def 才能;__init__(自我,,名字,,年龄): ,,,self.name =,名字 ,,,self.age =,年龄 ,,self.instance =,添加 def 才能__call__(自我,* args): ,,,return self.instance (* args) def 添加(args): return 才能args [0], +, arg游戏[1] 时间=a 人(& # 39;p1 # 39;,, 20) 打印(([1,2])) #这里将打印,3 #可见当创建这一个对象之后,如果定义了__call__函数则对象是可以像函数一样调用的。
(2) __getitem__定义获取容器中指定元素的行为,相当于自我(例子),如下: