python 单例模式 工厂模式_Python中的单例模式有几种实现方式?

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

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

问: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

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

更多题目:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值