Python中的单例模式有几种实现方式?

公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!

小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。

废话不多说,开始今天的题目:

问:Python中的单例模式有几种实现方式?

答:单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。在 Python 中,你可以想出几种种方法来实现单例模式呢?笔试题中,手写单例模式,也是经常碰到的,所以都要掌握下!

1、使用模块实现

Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:

#test1.py
class Singleton(object):
    def foo(self):
        pass
singleton = Singleton()

#test2.py
from 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 = name
s1 = 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
@singleton
class Singleton:
    def __init__(self, name):
        self.name = name
s1 = 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.__instance

class Singleton(metaclass=Singleton1):
    def __init__(self, name):
        self.name = name
s1 = Singleton('IT圈')
s2= Singleton('程序IT圈')
print(s1 == s2) # True

如果对于参考答案有不认同的,大家可以在评论区指出和补充,欢迎留言!

20、说说HTTP常见响应状态码?

21、Python 单、双引号、三引号区别?

22、说说Python中猴子补丁是什么?

23、说说Python中的垃圾回收机制?

24、Python中有几种交换两个变量的值?

25、说说Python中的6种位运算符?

26、说说Python中的类型转换有哪些?

27、Python中实现二分查找的2种方法?

28、说说Python中的lambda表达式?

29、说说Python中的反射是什么?

30、Python删除list重复元素有几种方法?

31、Python中__new__和__init__的区别?

32、说说Python中的help()和dir()函数?

33、说说Python中的GIL是什么?

34、说说提高Python运行效率的技巧?

35、说说对于Python装饰器的理解?

36、说说Python中的异常捕获?

关注小猿公众号,每天学习一道题

(0)

相关推荐