在网上看了有关python实现单例模式的博客,发现好多都是转载的,并且都是按照python2.x版本旧式类的方式写的。

虽然也能读懂,但对于我这种一开始学的就是python3.x的新手来说,心里总有点别扭。

所以今天我就把搜集来的单例模式稍加修改一下,以新式类的方式写下来。

1.在写代码之前,先理解一个概念,那就是元类metaclass,

  具体参考这篇文章:

  深刻理解Python中的元类(metaclass)

  https://www.cnblogs.com/tkqasn/p/6524879.html

  所以下面会用到__metaclass__创建类来实现单例

2.下面是不同方法实现单例的代码

  方法一:通过__new__方法实现单例

 class Singleton:
def __new__(cls,*args,**kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super().__new__(cls,*args,**kwargs)
return cls._instance class MyClass:
__metaclass__ = Singleton print(MyClass())
print(MyClass())

  方法二:通过元类实现单例

 class Singleton:
def __init__(cls,*args, **kwargs):
super().__init__(*args, **kwargs)
cls.instance = None
def __call__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__call__(*args, **kwargs)
return cls.instance class MyClass:
__metaclass__ = Singleton print(MyClass())
print(MyClass())

  方法三:通过decorator装饰器实现单例

 def singleton(cls, *args, **kwargs):
instances = {}
def get_instance():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance @singleton
class MyClass:
__metaclass__ = singleton print(MyClass())
print(MyClass())

  方法四:通过导入模块实现单例

 #  file1/mysingleton.py

 class Singleton:
def foo(self):
pass singleton = Singleton()

  注意:以上代码为一个单独模块,使用时直接导入即可。

 form mysingleton import singleton

 a = singleton
b = singleton print(a)
pring(b)
print(a is b)

python基础--新式类实现单例模式的更多相关文章

  1. python基础===新式类与经典类

    首先: Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Python 3.x中默认都是新式类,不必显式的继承object 这两种类的区别: 新式类重定义的方法更多,当然这不 ...

  2. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  3. python基础——枚举类

    python基础——枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单 ...

  4. python基础——定制类

    python基础——定制类 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方 ...

  5. Python基础-类的探讨(class)

    Python基础-类的探讨(class) 我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法  Python ...

  6. python基础(26):类的成员(字段、方法、属性)

    1. 字段 字段:包括普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同. 普通字段属于对象 静态字段属于类 字段的定义和使用: class Province: # ...

  7. python中新式类和经典类的区别

    1).python在类中的定义在py2-3版本上是使用的有新式类和经典类两种情况,在新式类和经典类的定义中最主要的区别是在定义类的时候是否出现引用object;如:经典类:Class 类名::而新式类 ...

  8. Python中新式类 经典类的区别(即类是否继承object)

    首先什么是新式类 经典类呢: #新式类是指继承object的类 class A(obect): ........... #经典类是指没有继承object的类 class A: ........... ...

  9. python 面向对象 新式类和经典类

    # 经典类写法 # schoolMember.__init__(self, name, age, sex) # 新式类写法 super(Teather, self).__init__(name, ag ...

随机推荐

  1. Linux笔记2-常用命令

    1.简单的命令 cd /    切到根路径 cd ..    回到上一级目录 pwd    显示当前路径 touch newFile    创建文件 mkdir xx    创建目录 mv file1 ...

  2. pip命令一般使用

    pip类似RedHat里面的yum,安装Python包非常方便.本节详细介绍pip的安装.以及使用方法. 1.pip下载安装 1.1 pip下载   1 # wget "https://py ...

  3. SpringBoot 快速支持国际化i18n

    学习目标 快速学会如何在工程中支持国际化语言. 快速查阅 专题阅读:<SpringBoot 布道系列> 源码下载:springboot-locale-i18n — Hey Man,Don' ...

  4. easyapi

    create database easyrec; #为easyrec初始化用户名跟密码grant index, create, select, insert, update, drop, delete ...

  5. axios之前端发送get与post请求模板

    import axios from "axios"; 一.get mounted() { axios .get( "/api/queryusertree?domId=&q ...

  6. spark的知识的链接

    IDEA 创建scala spark的Mvn项目:https://blog.csdn.net/u014646662/article/details/84618032 Spark详解03Job 物理执行 ...

  7. GET和POST是HTTP请求的两种基本方法,区别是什么!?

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  8. Redis Redis-Cell

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11632679.html 漏斗限流 漏斗限流是最常用的限流方法之一,另一个是令牌桶(比如:Guava R ...

  9. JavaScript中的回调地狱及解决方法

    1.回调地狱 在使用JavaScript时,为了实现某些逻辑经常会写出层层嵌套的回调函数,如果嵌套过多,会极大影响代码可读性和逻辑,这种情况也被成为回调地狱.比如说你要把一个函数 A 作为回调函数,但 ...

  10. 【BZOJ3473&BZOJ3277】字符串(广义后缀自动机)

    题意:给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串? 本质相同的子串算多个. 对于 100% 的数据,1<=n,k<=10^5,所有字符串总 ...