在网上看了有关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. 【学习总结】Python-3-转义字符

    参考: 本教程的评论区:菜鸟教程-Python3-Python数字 转义字符: 在需要在字符中使用特殊字符时,python用反斜杠()转义字符 END

  2. vue 中使用 watch 出现了如下的报错

    vue 中使用 watch 出现了如下的报错 报错: Method "watch" has type "object" in the component def ...

  3. 挖坑指南:iView-admin动态配置route.meta.title

    原文链接 前言 新的项目,基于iView-admin.结合自身的项目需求,对官方的模板进行一些修改.以达到动态修改route.meta,并同步更新面包屑导航文字和标签页标题. 开始 如果你还未使用过i ...

  4. Android学习电子书

           

  5. Flutter-ListView

    return Container( child: ListView( children: <Widget>[ Column( children: <Widget>[ Conta ...

  6. List、Map、Set的存储特点?

    List.Map.Set的存储特点? List:以特定次序来持有元素,可有重复元素 Set:无法拥有重复元素,内部排序 Map:保存key-value值,value可多值

  7. Spring----组合注解与元注解

    1.概述 1.1.Spring提供了大量的注解, 尤其是相同的注解用到各个类中,会相当的啰嗦: 1.2.元注解: 可以注解到别的注解上的注解: 组合注解: 被注解注解的注解称为 组合注解: 组合注解  ...

  8. 英语单词SYNOPSIS

    SYNOPSIS 来源——man帮助内容 BASH() General Commands Manual BASH() NAME bash - GNU Bourne-Again SHell SYNOPS ...

  9. 网络体系应用层之万维网、http协议

    1.万维网概述 万维网以客户--服务器方式工作,万维网客户程序就是各式各样的浏览器,万维网文档所驻留的主机则运行服务器程序, 因此这个主机也称为万维网服务器.客户程序向服务器程序发出请求,服务器程序向 ...

  10. Unity编程标准导引-3.4 Unity中的对象池

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...