python singleton design pattern super() 多继承
python singleton design pattern
decorate
baseclass
metaclass
import module
super()
一、A decorator
def singleton(class_):instances = {}def getinstance(*args, **kwargs):if class_ not in instances:instances[class_] = class_(*args, **kwargs)return instances[class_]return getinstance@singleton class MyClass(BaseClass):pass
当用MyClass() 去创建一个对象时这个对象将会是单例的。MyClass 本身已经是一个函数。不是一个类,所以你不能通过它来调用类的方法。所以对于
m=MyClass() n = MyClass() o=type(n)() m==n and m!=o and n != o 将会是True
二、baseclass
class Singleton(object):_instance = Nonedef __new__(class_, *args, **kwargs):if not isinstance(class_._instance, class_):# class_._instance = object.__new__(class_) 这行语句和下一行语句作用一样的class_._instance=super(Singleton,class_).__new__(class_)return class_._instance class MyClass(Singleton):def __init__(self,name):self.name = nameprint(name)
pros
是真的类
cons:
在多继承的时候要注意
三、metaclass
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]#Python2 class MyClass(BaseClass):__metaclass__ = Singleton#Python3 class MyClass(BaseClass, metaclass=Singleton):pass
Pros
- It's a true class
- Auto-magically covers inheritance
- Uses
__metaclass__
for its proper purpose (and made me aware of it)
四、通过导入模块
五、
super(type[,object or type])
If the second argument is omitted, the super object returned is unbound. If the second argument is an object, isinstance(obj, type)
must be true.
If the second argument is a type, issubclass(type2, type)
must be true (this is useful for classmethods).
note :super() 只能用于新式类
链接 https://rhettinger.wordpress.com/2011/05/26/super-considered-super/
多继承,在python3 中全部都是新式类
新式类的继承顺序是广度优先,python2 中的经典类是深度优先
通过一个例子来理解
class A(object):def f1(self):print('a.f1')class B(A):def f2(self):print('b.f1')class F(object):def f1(self):print('f.f1')class C(B,F):def f3(self):print('c.f1')insta = C() insta.f1()
关系图
将会打印出a.f1
如果代码改为
class A(object):def f1(self):print('a.f1')class B(A):def f2(self):print('b.f1')class F(A):def f1(self):print('f.f1')class C(B,F):def f3(self):print('c.f1')insta = C() insta.f1()
关系图如下:
运行结果是f.f1
python 2 代码如下
class A: #经典类 def foo(self): print'A'class B(A): def foo(self): print'B'class C(A): pass #def foo(self): # print'C'class D(B): #def foo(self): # print 'D' pass class F(B): #pass def foo(self): print 'F' pass class G(D,F): passg1=G()g1.foo() #打印出 B
python 3 代码
class A(object):def f1(self):print('a.f1')class B(A):pass def f1(self):print('b.f1')class C(A):def f1(self):print('c.f1')class D(B):pass# def f1(self):# print('D.f1')class F(B):passdef f1(self):print('f.f1')class G(D,F):# def f1(self):# print('g.f1')passinsta = G() insta.f1() #打印出f.f1
转载于:https://www.cnblogs.com/yuyang26/p/7717571.html
python singleton design pattern super() 多继承相关推荐
- Java Singleton Design Pattern (单例模式 SE7 Gold)
singleton design pattern offer 2 things: one and only one instance of the class, and a global single ...
- Design Pattern - Singleton(C#)
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Defi ...
- 源于Design Pattern Explanation with C++ Implementation的 设计模式 C++
1.创建型模式 (Creational Pattern) 1.1 工厂模式(Factory Pattern ) 1.2 抽象工厂模式(Abstract Factory Pattern ) 1.3 ...
- Python super钻石继承
1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object):def __init__ ...
- Design Pattern Quick Overview
Do we really need this design pattern? Just ignore, all the big guys requires it. For you, just unde ...
- 初读设计模式-----《design pattern explained》读后感
从网上淘来了一本<design pattern explained>,用了半个月的时间细细的读完了这本书. 本打算单单的从技术角度进行总结的,但是却全然没有头绪.说说自己的粗浅的感悟吧.. ...
- 设计模式(Design Pattern)
简介 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人 ...
- Head First Design Pattern 读书笔记(4) 工厂模式
2019独角兽企业重金招聘Python工程师标准>>> Head First Design Pattern 读书笔记(4) Factory Pattern 工厂模式 ##Factor ...
- 设计模式(Design Pattern)详细整理(含思维导图)
设计模式(Design Pattern) 设计模式(Design pattern)代表了最佳的实践,是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过相当长的一 ...
最新文章
- 【培训】 项目实训中遇到的问题 总结 跟解决方法
- linux / 终端常用快捷键
- ASP.NET 开发者 开始学习ASP.NET Core 2吧
- canvas笔记-lineJoin和miterLimit的使用
- 通过实现网站访问计数器带你理解 轻量级锁CAS原理,还学不会算我输!!!
- Python语法之com[1][:-7]
- 不能正常判断按键函数中的Flag
- 在cdh5.1.3中在mapreduce使用hbase
- Python新建文件夹
- 深入理解JVM-java内存区域与内存溢出异常
- Local Database Overview for Windows Phone
- 结对-结对编项目作业名称-最终程序
- [手把手教你] 用Swoft 搭建微服务(TCP RPC)
- 全国计算机一级模拟考试电脑版,全国计算机等级考试一级计算机基础及MS Office应用模拟练习系统...
- C#硬件开发源码集合
- [lua]紫猫lua教程-命令宝典-L1-01-09. string字符串函数库
- matlab形成n个对角阵,matlab-线性代数 创建 N阶数量矩阵 N阶单位矩阵 对角矩阵 范德蒙矩阵 等差数列...
- MFC快速创建bmp图片
- 学生用计算机中括号怎么打,大括号怎么打,教您word大括号怎么输入
- Mentor.Graphics.AMS.v2011.1 Win32_64 1CD(电路设计)