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