python  singleton design pattern

  1. decorate

  2. baseclass

  3. metaclass

  4. import module

  5. 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() 多继承的更多相关文章

  1. Singleton Design Pattern

    The Singleton pattern is one of the simplest design patterns, which restricts the instantiation of a ...

  2. Design Principle vs Design Pattern 设计原则 vs 设计模式

    Design Principle vs Design Pattern设计原则 vs 设计模式 来源:https://www.tutorialsteacher.com/articles/differen ...

  3. Null Object Design Pattern (Python recipe)

    Null Object 个人感觉非常有用.也是在review公司其他同事写代码的时候看到. 当时使用了flask的request全局请求变量g,然后使用了g.x保存了一个东西. 当时在view代码读取 ...

  4. Design Pattern —— Singleton

    Design Pattern —— Singleton   强力推荐枚举和类级内部类方式实现单例模式 单例模式是开发中非常常用的一种模式,简单的说,我们希望一个类永远都只有一个对象. 主要有两个用途: ...

  5. [Design Pattern] Singleton Pattern 简单案例

    Singleton Pattern, 即单例模式,用于获取类的一个对象,该对象在整个应用中是其类的唯一对象.单例模式属于创建类的设计模式. SingleObject 作为单例类,内含了一个静态私有的 ...

  6. 关于Python中的类普通继承与super函数继承

    关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...

  7. 说说设计模式~大话目录(Design Pattern)

    回到占占推荐博客索引 设计模式(Design pattern)与其它知识不同,它没有华丽的外表,没有吸引人的工具去实现,它是一种心法,一种内功,如果你希望在软件开发领域有一种新的突破,一个质的飞越,那 ...

  8. 设计模式(Design Pattern)系列之.NET专题

    最近,不是特别忙,重新翻了下设计模式,特地在此记录一下.会不定期更新本系列专题文章. 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用 ...

  9. [转]Design Pattern Interview Questions - Part 4

    Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...

随机推荐

  1. HNOI2019 摸鱼记

    感觉准备省选时有点浮躁,没有准备联赛时那样认真, 希望能将这次省选当做一个教训吧QAQ. Day -inf 基本上把要学的东西都学了,至少做到了自己心里有底. Day 0 乒乓球室没开差评,打隔膜不带 ...

  2. SQL 追踪

    SQL追踪(SQL Trace)是一个轻量级的追踪工具,按照事件(Events)记录数据库发生的消息,几乎对数据库性能没有什么影响.SQL Server内置一个Trace,称作默认追踪(Default ...

  3. SSRS配置1:凭证和邮件

    SSRS是微软的高度集成的报表服务,通过报表服务配置管理器(Reporting Service Configuration Manager,简称RSCM),能够轻松实现报表的配置和管理,本文主要分享凭 ...

  4. git和github使用教程

    看官请移步git和github简单教程, 本文是上述链接的截图,担心哪天作者不小心删除了,备一份在自己这里,仅为自己看着方便.侵权请告知

  5. 架构师修练 I - 超级代码控

    可实现的是架构,空谈是概念 So don't tell me the concepts show me the code!  “不懂编码的架构师不是好架构师” 好架构师都是超级代码控.   代码是最好 ...

  6. EditText点击出现光标但不弹出软键盘

    3.0以下版本可以用editText.setInputType(InputType.TYPE_NULL)来实现.或者设置editText.setKeyListener(null)来实现. 3.0以上版 ...

  7. 转 ssh-keygen 的 详解

    为了让两个linux机器之间使用ssh不需要用户名和密码.所以采用了数字签名RSA或者DSA来完成这个操作. 模型分析 假设 A (192.168.20.59)为客户机器,B(192.168.20.6 ...

  8. redis在php中常用的语法(转)

    String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 $redis-> ...

  9. 关于OBS获取显示器黑屏的解决办法

    近来看到许多人说OBS获取显示器源的时候黑屏,下面介绍下相关处理办法. 第一种,先尝试把OBS程序的兼容性设置成Win 7和管理员身份,具体操作: 设置成这样,如果能够获取到显示器,那么问题解决,否则 ...

  10. [T-ARA][결혼 하지마][不要结婚]

    歌词来源:http://music.163.com/#/song?id=27808773 作曲 : 二段横踢 [作曲 : 二段横踢] 作词 : 二段横踢 [作词 : 二段横踢] Hey anybody ...