博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python中的单例模式
阅读量:6912 次
发布时间:2019-06-27

本文共 1782 字,大约阅读时间需要 5 分钟。

单例模式是一种经常使用的设计模式,其定义解释很好理解,核心是一个实例对象,更加详细的解释就更是百度一个一大堆了,这里说 Python 中单例模式的实现的几种方法:

​单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

 

使用模块

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

1 # a.py中的内容 2  3 class Student(object): 4     def eat(): 5         pass 6  7 s = Student() 8  9 10 # b.py中的内容11 12 from a import s13 14 ## a.py和b.py在同一路径下

 

使用 __new__ 方法

__new__()__init__()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例 这个绝对常考

1 class Singleton(object):2 3      _instance = None4     def __new__(cls, *args, **kwargs):5         if not cls._instance:6             cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  7         return cls._instance

在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance

 

使用装饰器

装饰器(decorator)可以动态地修改一个类或函数的功能。这里,我们也可以使用装饰器来装饰某个类,使其只能生成一个实例

1 from functools import wraps 2   3 def singleton(cls): 4     instances = {} 5     @wraps(cls) 6     def getinstance(*args, **kwargs): 7         if cls not in instances: 8             instances[cls] = cls(*args, **kwargs) 9         return instances[cls]10     return getinstance11  12 @singleton13 class MyClass(object):14     a = 1

使用 metaclass

元类(metaclass)可以控制类的创建过程,它主要做三件事:

  • 拦截类的创建
  • 修改类的定义
  • 返回修改后的类
1 class Singleton(type): 2     _instances = {} 3     def __call__(cls, *args, **kwargs): 4         if cls not in cls._instances: 5             cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) 6         return cls._instances[cls] 7  8  9 10 class MyClass(metaclass=Singleton):11     pass

参考链接:

 

转载于:https://www.cnblogs.com/springionic/p/10701848.html

你可能感兴趣的文章
Context Switch Definition
查看>>
VS2015 Git 插件使用教程
查看>>
【转】iOS静态库 【.a 和framework】【超详细】
查看>>
iOS10 UI教程视图和子视图的可见性
查看>>
微信公众平台中的openid是什么?
查看>>
数据库三个范式详解
查看>>
使用JSON Web Token设计单点登录系统--转
查看>>
对于PHP中enum的好奇
查看>>
守护进程监控tomcat并自己主动重新启动
查看>>
协程基础_context系列函数
查看>>
排序算法总结之折半插入排序
查看>>
Simple calculations
查看>>
python list的+,+=,append,extend
查看>>
MySQL架构组成之逻辑模块组成
查看>>
DuiVision开发教程(19)-菜单
查看>>
Spark Streaming中的操作函数讲解
查看>>
长尾理论,长尾示意图,读书笔记
查看>>
Testing Is the Engineering Rigor of Software Development
查看>>
01、Spar内核架构原理
查看>>
多协议注入工具t50
查看>>