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 = None
def __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 = name
print(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):
pass
g1=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):
pass
def f1(self):
print('f.f1') class G(D,F):
# def f1(self):
# print('g.f1')
pass insta = G()
insta.f1() #打印出f.f1

python singleton design pattern super() 多继承的更多相关文章
- Singleton Design Pattern
The Singleton pattern is one of the simplest design patterns, which restricts the instantiation of a ...
- Design Principle vs Design Pattern 设计原则 vs 设计模式
Design Principle vs Design Pattern设计原则 vs 设计模式 来源:https://www.tutorialsteacher.com/articles/differen ...
- Null Object Design Pattern (Python recipe)
Null Object 个人感觉非常有用.也是在review公司其他同事写代码的时候看到. 当时使用了flask的request全局请求变量g,然后使用了g.x保存了一个东西. 当时在view代码读取 ...
- Design Pattern —— Singleton
Design Pattern —— Singleton 强力推荐枚举和类级内部类方式实现单例模式 单例模式是开发中非常常用的一种模式,简单的说,我们希望一个类永远都只有一个对象. 主要有两个用途: ...
- [Design Pattern] Singleton Pattern 简单案例
Singleton Pattern, 即单例模式,用于获取类的一个对象,该对象在整个应用中是其类的唯一对象.单例模式属于创建类的设计模式. SingleObject 作为单例类,内含了一个静态私有的 ...
- 关于Python中的类普通继承与super函数继承
关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...
- 说说设计模式~大话目录(Design Pattern)
回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...
- 设计模式(Design Pattern)系列之.NET专题
最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...
- [转]Design Pattern Interview Questions - Part 4
Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...
随机推荐
- HNOI2019 摸鱼记
感觉准备省选时有点浮躁,没有准备联赛时那样认真, 希望能将这次省选当做一个教训吧QAQ. Day -inf 基本上把要学的东西都学了,至少做到了自己心里有底. Day 0 乒乓球室没开差评,打隔膜不带 ...
- SQL 追踪
SQL追踪(SQL Trace)是一个轻量级的追踪工具,按照事件(Events)记录数据库发生的消息,几乎对数据库性能没有什么影响.SQL Server内置一个Trace,称作默认追踪(Default ...
- SSRS配置1:凭证和邮件
SSRS是微软的高度集成的报表服务,通过报表服务配置管理器(Reporting Service Configuration Manager,简称RSCM),能够轻松实现报表的配置和管理,本文主要分享凭 ...
- git和github使用教程
看官请移步git和github简单教程, 本文是上述链接的截图,担心哪天作者不小心删除了,备一份在自己这里,仅为自己看着方便.侵权请告知
- 架构师修练 I - 超级代码控
可实现的是架构,空谈是概念 So don't tell me the concepts show me the code! “不懂编码的架构师不是好架构师” 好架构师都是超级代码控. 代码是最好 ...
- EditText点击出现光标但不弹出软键盘
3.0以下版本可以用editText.setInputType(InputType.TYPE_NULL)来实现.或者设置editText.setKeyListener(null)来实现. 3.0以上版 ...
- 转 ssh-keygen 的 详解
为了让两个linux机器之间使用ssh不需要用户名和密码.所以采用了数字签名RSA或者DSA来完成这个操作. 模型分析 假设 A (192.168.20.59)为客户机器,B(192.168.20.6 ...
- redis在php中常用的语法(转)
String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 $redis-> ...
- 关于OBS获取显示器黑屏的解决办法
近来看到许多人说OBS获取显示器源的时候黑屏,下面介绍下相关处理办法. 第一种,先尝试把OBS程序的兼容性设置成Win 7和管理员身份,具体操作: 设置成这样,如果能够获取到显示器,那么问题解决,否则 ...
- [T-ARA][결혼 하지마][不要结婚]
歌词来源:http://music.163.com/#/song?id=27808773 作曲 : 二段横踢 [作曲 : 二段横踢] 作词 : 二段横踢 [作词 : 二段横踢] Hey anybody ...