栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python-单例模式示例用法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python-单例模式示例用法

文章目录
    • 单例定义及优点
    • python使用单例
      • 通过classmethod 实现
      • 通过__new__
      • 通过装饰器实现
      • 通过导入模块

单例定义及优点
  • 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。 也就是说 多次实例化的结果指向同一个内存地址 ,无论产生多个对象,都会指向 单个 实例
  • 使用单例优点: 节省内存
python使用单例
	1.通过classmethod
    2.通过装饰器实现
    3.通过__new__实现
    4.通过导入模块时实现
    5.通过元类实现。
通过classmethod 实现
class Test:

	# 一个默认值,用于判断对象是否存在, 对象不存在证明值是None
    # __instance是类的属性,可以由类来调用
    __instance = None

    @classmethod
    def singleton(cls):
        if not cls.__instance:
	        # 产生一个对象并返回
            obj = cls()
            # None ---> obj
            cls.__instance = obj
            
     	# 若__instance中有值,证明对象已经存在,则直接返回该对象
        return cls.__instance

t1 = Test.singleton()
t2 = Test.singleton()
print(t1)  # <__main__.Test object at 0x000002376E916BC8>
print(t2)  # <__main__.Test object at 0x000002376E916BC8>
通过__new__
class Test1:

    __instance = None

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            # 造一个空对象
            cls.__instance = object.__new__(cls)
        return cls.__instance

t1 = Test1()
t2 = Test1()
print(t1)  # <__main__.Test1 object at 0x000001F8088C8F48>
print(t2)  # <__main__.Test1 object at 0x000001F8088C8F48>
通过装饰器实现
  • 无参数形式
# 无参数形式
def singleton(cls):
    _instance = {}

    def inner(*args, **kwargs):
        if cls not in _instance:
            obj = cls(*args, **kwargs)
            _instance[cls] = obj
        return _instance[cls]
    return inner


@singleton
class Test2:  # Test2 =singleton(Test2)  Test2=inner
    pass

t1 = Test2()  # inner()
t2 = Test2()
print(t1)
print(t2)
  • 带参数形式
def singleton(cls):
    _instance = {}

    def inner(*args, **kwargs):
        if cls not in _instance:
            obj = cls(*args, **kwargs)
            _instance[cls] = obj
        return _instance[cls]
    return inner


@singleton
class Test2:  # Test2 =singleton(Test2)  Test2=inner
    def __init__(self, x, y):
        self.x = x
        self.y = y

t1 = Test2(1,2)
t2 = Test2(3,4)
print(t1)
print(t2)

通过导入模块
通过导入模块:

Singleton.py

class Father:
    pass
obj = Father()

单例模式.py
from Singleton import obj
print(obj)
from Singleton import obj
print(obj)
from Singleton import obj
print(obj)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026647.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号