请阐述在 Python 语言中实现单例模式的具体方法有哪些?
考察说明
考查对Python单例模式实现方式及原理的理解。
回答思路
- 【回答框架 1】单例模式确保一个类仅有一个实例,并提供一个全局访问点。Python中常见实现包括:使用模块(模块天然单例,导入一次即只有一个实例)、使用__new__方法重写来控制实例创建、使用装饰器缓存实例、使用元类(metaclass)来控制类实例化过程。
- 【回答框架 2】基于__new__的实现:在类的__new__方法中判断类属性_instance是否为None,若为None则创建实例并赋值,否则返回已有实例。注意线程安全问题,可通过加锁(如threading.Lock)来保证多线程环境下只创建一次实例。
- 【回答框架 3】基于装饰器的实现:定义一个装饰器,内部使用字典缓存类实例,键为类,值为实例。调用类时检查缓存,命中则返回缓存实例,否则创建并缓存。此方式无需修改类本身,可适用于任何类。
- 【回答框架 4】基于元类的实现:定义元类,在元类的__call__方法中控制实例创建。元类的__call__在类被调用时执行,同样通过判断是否已有实例来决定创建或返回。元类方式更符合Python的面向对象特性,且能统一管理多个类的单例化。
- 【关键点 1】模块是天然的单例实现方式。
- 【关键点 2】重写__new__是常用方法,需处理线程安全。
- 【关键点 3】装饰器和元类提供了灵活的单例实现途径。
- 【易错点 1】忽略线程安全导致多线程下创建多个实例。
- 【易错点 2】使用__new__时要注意基类object的__new__正确调用。
- 【易错点 3】单例模式在序列化、多进程等场景下可能失效。