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

“Python的单例模式有四种写法,你知道么?”——孔乙己

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

“Python的单例模式有四种写法,你知道么?”——孔乙己

什么是单例模式

单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

使用场景:

1、要求生产唯一序列号。

2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

代码实现 1 使用__new__方法

__new__()在__init__()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。
对这块不了解的,可以查看我以前发的文章:

Python类中的__new__和__init__的区别

class Singleton(object):
    def __new__(cls, *args, **kw):
 if not hasattr(cls, '_instance'):
     orig = super(Singleton, cls)
     cls._instance = orig.__new__(cls, *args, **kw)
 return cls._instance

class MyClass(Singleton):
    a = 1
2 共享属性

创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.

class Borg(object):
    _state = {}
    def __new__(cls, *args, **kw):
 ob = super(Borg, cls).__new__(cls, *args, **kw)
 ob.__dict__ = cls._state
 return ob

class MyClass2(Borg):
    a = 1
3 装饰器版本
def singleton(cls):
    instances = {}
    def getinstance(*args, **kw):
 if cls not in instances:
     instances[cls] = cls(*args, **kw)
 return instances[cls]
    return getinstance

@singleton
class MyClass:
  ...
4 import方法

作为python的模块是天然的单例模式

mysingleton.py

class My_Singleton(object):
    def foo(self):
 pass

my_singleton = My_Singleton()

# to use
from mysingleton import my_singleton

my_singleton.foo()
验证一下

我们可以看到类对象和内存id()是一样的。

参考文档

  1. https://www.runoob.com/design-pattern/singleton-pattern.html

本文首发于BigYoung小站

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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