python基础--新式类实现单例模式
在网上看了有关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基础--新式类实现单例模式的更多相关文章
- python基础===新式类与经典类
首先: Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Python 3.x中默认都是新式类,不必显式的继承object 这两种类的区别: 新式类重定义的方法更多,当然这不 ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- python基础——枚举类
python基础——枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单 ...
- python基础——定制类
python基础——定制类 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方 ...
- Python基础-类的探讨(class)
Python基础-类的探讨(class) 我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法 Python ...
- python基础(26):类的成员(字段、方法、属性)
1. 字段 字段:包括普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同. 普通字段属于对象 静态字段属于类 字段的定义和使用: class Province: # ...
- python中新式类和经典类的区别
1).python在类中的定义在py2-3版本上是使用的有新式类和经典类两种情况,在新式类和经典类的定义中最主要的区别是在定义类的时候是否出现引用object;如:经典类:Class 类名::而新式类 ...
- Python中新式类 经典类的区别(即类是否继承object)
首先什么是新式类 经典类呢: #新式类是指继承object的类 class A(obect): ........... #经典类是指没有继承object的类 class A: ........... ...
- python 面向对象 新式类和经典类
# 经典类写法 # schoolMember.__init__(self, name, age, sex) # 新式类写法 super(Teather, self).__init__(name, ag ...
随机推荐
- C#设计模式:抽象工厂(Abstract Factory)
一,抽象工厂模式 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- C#设计模式:单例模式(Singleton)
一,单例模式:它的主要特点不是根据客户程序调用生成一个新的实例,而是控制某个类型的实例数量-唯一一个,就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该 ...
- axios 利用new FileReader() 下载文件获取返回的错误信息
this.axios({ method: "post", url: url, data: data, ...
- C#windows向窗体传递泛型类
修改窗体代码文件*.cs public partial class FormName<T> : Form partial说明此类还有一半在另外的cs文件中,正是系统替你写好的*.desig ...
- rpm - RPM 软件包管理器
SYNOPSIS 查询和校验软件包: rpm {-q|--query} [select-options] [query-options] rpm {-V|--verify} [select-optio ...
- mysql的锁
前言 mysql锁的概念参考如下连接: 1.http://blog.csdn.net/u013063153/article/details/53432468 2.http://www.yesky.co ...
- html5 图片墙
代码实例: <!DOCTYPE html> <html> <head> <style> body,html{ padding:0;margin:0;wi ...
- Java集合框架Map接口
集合框架Map接口 Map接口: 键值对存储一组对象 key不能重复(唯一),value可以重复 常用具体实现类:HashMap.LinkedHashMap.TreeMap.Hashtable Has ...
- Redis中的GETBIT和SETBIT
来自:https://www.cnblogs.com/K-artorias/p/8463286.html Redis是in-memery的数据库,其优势不言而喻. 在学习到strings类型的常见命令 ...
- 51nod 1490: 多重游戏(树上博弈)
题目链接 该题实质上是一个树上博弈的问题.要定义四种状态——2先手必胜 1先手必败 3可输可赢 0不能控制 叶子结点为先手必败态: 若某结点的所有儿子都是先手必败态,则该结点为先手必胜态: 若某结点的 ...