小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。
废话不多说,开始今天的题目:
问:Python中的单例模式有几种实现方式?
答:单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。在 Python 中,你可以想出几种种方法来实现单例模式呢?笔试题中,手写单例模式,也是经常碰到的,所以都要掌握下!
1、使用模块实现
Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:
#test1.pyclass Singleton(object): def foo(self): passsingleton = Singleton()#test2.pyfrom test1 import singleton
2、用__new__特殊方法实现
class Singleton: def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls) return cls._instance def __init__(self, name): self.name = names1 = Singleton('IT圈')s2= Singleton('程序IT圈')print(s1 == s2) # True
3、使用装饰器实现
def singleton(cls): _instance = {} def inner(*args, **kwargs): if cls not in _instance: _instance[cls] = cls(*args, **kwargs) return _instance[cls] return inner@singletonclass Singleton: def __init__(self, name): self.name = names1 = Singleton('IT圈')s2= Singleton('程序IT圈')print(s1 == s2) # True
4、类装饰器实现
class Singleton:
def __init__(self, cls):
self._cls = cls
self._instance = {}
def __call__(self, *args):
if
self._cls
not
in
self.
_instance:
self._instance[
self._cls] =
self._cls(*args)
return
self._instance[
self._cls]
@Singleton
class Singleton:
def __init__(self, name):
self.name = name
s1 = Singleton(
'IT圈')
s2= Singleton(
'程序IT圈')
print(s1 == s2)
# True
5、使用元类实现方式
class Singleton1(type): def __init__(self, *args, **kwargs): self.__instance = None super(Singleton1, self).__init__(*args, **kwargs) def __call__(self, *args, **kwargs): if self.__instance is None: self.__instance = super(Singleton1, self).__call__(*args, **kwargs) return self.__instanceclass Singleton(metaclass=Singleton1): def __init__(self, name): self.name = names1 = Singleton('IT圈')s2= Singleton('程序IT圈')print(s1 == s2) # True
如果对于参考答案有不认同的,大家可以在评论区指出和补充,欢迎留言!
更多题目:
关注小猿公众号,每天学习一道题