Python面试技巧:单例模式与装饰器解析

需积分: 5 0 下载量 161 浏览量 更新于2024-08-03 收藏 72KB MD 举报
"Python面试宝典-基础篇-2020" 在Python面试中,了解和能够实现单例模式是非常重要的。单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这在需要频繁实例化然后销毁的对象,或者需要共享状态的对象等场景中非常有用。面试官常以此来考察应聘者对Python语言特性和设计模式的掌握程度。 ### 单例模式的实现 #### 方法一:使用装饰器实现 装饰器在Python中是一个强大的工具,它可以用于修改或增强函数、类的行为。以下是一个使用装饰器实现单例模式的例子: ```python from functools import wraps def singleton(cls): instances = {} @wraps(cls) def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper @singleton class President: pass ``` 在这个例子中,装饰器`singleton`会检查类实例是否已经存在,如果不存在则创建一个新的实例并存储在字典`instances`中,后续的调用将直接返回这个唯一的实例。 #### 装饰器的扩展 装饰器在Python中有着广泛的应用,如日志记录、性能测试、事务处理等。`functools.wraps`是装饰器的一个辅助工具,它用于保留被装饰对象的元信息(如名称、文档字符串等),以保持原函数或类的行为。例如,通过`President.__wrapped__`可以访问未被装饰的`President`类。 ### 线程安全的单例 上述单例模式的实现并非线程安全,即在多线程环境中可能会创建多个实例。要解决这个问题,可以使用Python的`threading`模块提供的`RLock`(可重入锁)来确保线程安全: ```python from threading import RLock class Singleton(object): _instance = None _lock = RLock() def __new__(cls, *args, **kwargs): with cls._lock: if cls._instance is None: cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance ``` 在这个版本的单例模式中,`_lock`是一个`RLock`对象,它保证了在同一时刻只有一个线程可以执行`__new__`方法,从而确保了单例的线程安全性。 ### 总结 在Python面试中,除了单例模式,装饰器和线程安全也是常见的面试主题。理解这些概念以及它们在实际编程中的应用,能体现出你对Python高级特性的掌握程度。熟悉这些知识点对于提升你在求职面试中的竞争力至关重要。