Python语法进阶篇 --- 单例模式、魔法方法前置补充内容单例模式魔法方法一只正在努力学习计算机技术的小仓鼠前置补充内容一个对象的实例化过程首先执行__new__()创建对象如果没有写__new__()默认调用object里面的__new__()返回一个实例对象然后调用__init__()初始化对象。名称方法级别目的作用__new__()类创建对象1. 在内存中为对象分配空间2. 返回对象的引用__init__()实例实例化对象定义实例属性classTest(object):def__init__(self):print(这是__init__()方法)# __new__()是静态方法形参里有cls实参就必须传clsdef__new__(cls,*args,**kwargs):print(cls)print(我是__new__()方法)# 重写__new__()一定要返回实例对象的引用否则Python解释器得不到分配空间的对象引用就不会调用__init__()方法returnsuper().__new__(cls)teTest()print(te:,te)单例模式含义单例模式是一种常用的软件设计模式该模式的目的为确保一个类中只能存在一个实例。应用场景回收站、音乐播放器、数据库连接池的设计等。优点节省内存空间 缺点多线程访问容易引发线程安全问题实现方法重写__new__()函数classSingleton(object):# 定义一个类属性初始值为None用来记录单例对象的引用objNone# 重写new方法def__new__(cls,*args,**kwargs):# 如果类属性时None把__new__()返回的对象引用保存进去ifcls.objisNone:cls.objsuper().__new__(cls)# 返回类属性中记录的对象引用returncls.obj s1Singleton()print(s1)s2Singleton()print(s2)魔法方法含义在Python中__xxx__()的函数叫做魔法方法特指具有特殊功能的函数。__doc__()类的描述信息classPerson(object):# 只能使用多行注释单行注释无效 人类 - 类的描述信息 passdefsing(): 唱歌 passprint(Person.__doc__)print(sing.__doc__)__module__()表示当前操作对象所在的模块__class__()表示当前操作对象所在的类# pytest.pyclassA(object):defsmile(self):print(微笑函数)# main.pyimporttest.pytest atest.pytest.A()a.smile()print(module: ,a.__module__)print(class: ,a.__class__)__str__()对象的描述信息classB(object):string我是# 如果类中定义了该方法那么在打印对象时默认输出该方法的返回值也就是打印方法中return的数据def__str__(self):# 必须有返回值并且一定是字符串类型returnB.string字符串stringbB()print(b)__del__()析构函数在程序结束或者删除对象时被调用__call__()使一个实例对象成为一个可调用对象callable()可以判断一个对象是否是可调用对象classC(object):def__call__(self,*args,**kwargs):print(这是__call__函数)cC()print(可调用%s%callable(c))# 调用一个可调用的实例对象其实就是在调用它的__call__()方法c()