1. 使用模块
2. 使用装饰器
3. 使用__new__(父类重写new继承方法)
4. 使用元类(元类重写call){类的创建过程(①.拦截类的创建;②.修改类的定义;③.返回修改后的类}
下面例举前两种的方法
使用python模块
python模块 是天然的单例模式. 模块被第一次导入时,会生成 .pyc 文件. 第二次被导入时,加载 .pyc文件. 而不会再次执行模块代码. 所以说: 把相关函数和数据定义在一个模块中 就可以获得一个单例对象.
# mysingle.py
class MySingle:
def foo(self):
pass
singleton = MySingle()
上面代码保存到mysingle.py中 然后在新的pyc 文件中写上下方代码
from mysingle import singleton
singleton.foo()
使用装饰器的方法
装饰器可以动态的修改一个类或函数的功能。我们也可以使用装饰器来装饰某
个类,使其只能生成一个实例.
def singleton(cls):
instances = { }
def getinstances(*args, **kwargs)
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return getinstances
@singleton
Class MyClass:
a = 2
b1 = MyClass
b2 = MyClass
print(b1 == b2)
# 打印值为 True