技术交流QQ群:1027579432,欢迎你的加入!

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Date : 2019-01-21 09:09:09

# @Author : cdl (1217096231@qq.com)

# @Link : https://github.com/cdlwhm1217096231/python3_spider

# @Version : $Id$

"""

单例模式singleton:一种常见的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

在 Python 中,我们可以用多种方法来实现单例模式:

1.使用模块

2.使用__new__

3.使用装饰器

4.使用元类

"""

# 1.使用模块

"""

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

"""

from mysingleton import my_singleton

my_singleton.foo()

# 2.使用__new__()

"""

为了使类只能出现一个实例,可以使用__new__来控制实例的创建过程

"""

class Singleton(object):

_instance = None # 类变量

def __new__(cls, *args, **kw):

if not cls._instance:

cls._instance = super(Singleton, cls).__new__(

cls, *args, **kw) # 将类的实例和一个类变量 _instance 关联起来

return cls._instance

class MyClass(Singleton):

a = 1

one = MyClass()

two = MyClass()

print(one is two)

print(id(one), id(two))

# 3.使用装饰器

"""

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

"""

from functools import wraps

# 定义了一个装饰器 singleton,它返回了一个内部函数getinstance,该函数会判断某个类是否在字典instances 中,如果不存在,则会将cls作为 key,cls(*args, **kw) 作为 value存到instances中。否则,直接返回instances[cls]

def singleton(cls):

instances = {}

@wraps(cls)

def getinstance(*args, **kwargs):

if cls not in instances:

instances[cls] = cls(*args, **kwargs)

return instances[cls]

return getinstance

# 被装饰的函数

@singleton

class MyClass(object):

a = 1

# 4.使用元类metaclass

"""

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

a.拦截类的创建

b.修改类的定义

c.返回修改后的类

"""

class Singleton(type):

_instances = {}

def __call__(cls, *args, **kwargs):

if cls not in cls._instances:

cls._instances[cls] = super(

Singleton, cls).__call__(*args, **kwargs)

return cls._instances[cls]

class MyClass(metaclass=Singleton):

pass

python3单例模式_python3中的单例模式Singleton相关推荐

  1. android中的单例模式,Android中的单例模式

    定义: 单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 使用场景: 确保某一个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一 ...

  2. java spring 单例模式,spring中的单例模式

    spring依赖注入的bean默认都是单例模式,他们是怎么创建的? 在AbstractBeanFactory类中的getBean方法中调用了getSingleton()方法来创建bean: @Null ...

  3. python3数据类型_python3中到底有几类数据类型?

    list: 链表, 有序的项目, 通过索引进行查找, 使用方括号"[]" dict: 字典, 字典是一组键(key)和值(value)的组合, 通过键(key)进行查找, 没有顺序 ...

  4. 【C++】C/C++ 中的单例模式

    目录 part 0:单例模式3种经典的实现方式 Meyer's Singleton Meyers Singleton版本二 Lazy Singleton Eager Singleton Testing ...

  5. C# 中实现单例模式

    文章目录 简介 不安全线程的单例模式 简单安全线程带锁 双重检查 - 带锁 安全初始化 安全并且懒汉式静态初始化 带泛型的懒汉式单例 异常 提高效率 总结 简介 单例模式是软件工程中广为人知的设计模式 ...

  6. python编程入门单例_常见的在Python中实现单例模式的三种方法

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

  7. 在Java中实现单例模式的有效方法是什么? [关闭]

    在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...

  8. Python中创建单例模式的六种方式

    一.基于装饰器实现单例模式 #装饰器实现单例模式def singleTon(cls):def wrapper(*args,**kwargs):if not hasattr(cls,'_instance ...

  9. Go语言中的单例模式

    转载地址:https://mp.weixin.qq.com/s/JAlt0JQt8hkPCxYbmOMFJw Go语言中的单例模式 在过去的几年中,Go语言的发展是惊人的,并且吸引了很多由其他语言(P ...

  10. android单例模式代码,设计模式(一):Android 源码中的单例模式

    设计模式(一):Android 源码中的单例模式 2020-08-17 22:51 阅读数 57 <>什么是单例模式? 单例模式(Singleton) 是最常见也最简单的设计模式,它的目的 ...

最新文章

  1. 综述 | 三大路径,一文总览知识图谱融合预训练模型的研究进展
  2. 【转】C#解析HTML
  3. 2012年初二晚越秀公园游灯有感一二
  4. 好好学python·基本数据类型
  5. 深度学习100例-卷积神经网络(VGG-19)识别灵笼中的人物 | 第7天
  6. 在ump系统的那半个多月-jqGrid
  7. kafka消费者如何读同一生产者消息_Kafka入门之生产者消费者
  8. Service IP 原理 - 每天5分钟玩转 Docker 容器技术(137)
  9. python自动化办公知识点整理汇总_python自动化办公小结
  10. c# linq的差集,并集,交集,去重【转】
  11. day32 java的多线程(4)synchronized
  12. PHP 500 -Invalid command RewriteEngine的解决
  13. 说说.NET中忽视的方法
  14. 运行控制器方法之前先执行注解@ModelAttribute的方法
  15. 深度学习中的自动编码器:TensorFlow示例
  16. Android 四大组件学习之Activity五
  17. 数据结构顺序栈基本操作(C/C++实现)
  18. eWebEditor的使用
  19. spring boot入门 -- 介绍和第一个例子
  20. java 线性回归_多元线性回归----Java简单实现

热门文章

  1. oracle日志满了删除,oracle日志文件满了
  2. 使用wireshark进行安卓抓包分析
  3. LSF集群基本概念介绍
  4. 线性代数学习笔记(七)——克莱姆法则
  5. 用文氏图表示映射满射单射及函数的关系
  6. linux必会的30道shell编程面试题及讲解
  7. Excel将多行带空格的数据插入到表格中
  8. git文件夹不区分大小写_Git区分大小写并且您的文件系统可能不区分大小写-Windows上奇怪的文件夹合并
  9. 【全套攻略】关于建站、服务器、云虚拟主机你想知道的都在这里!
  10. 关于IT程序员一些面试技巧