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. Source insight 中 标题栏路径显示完整路径的方法

    在source insight 的标题栏中显示完整路径名的方法.Options -> Preferences -> Display -> Trim long path names w ...

  2. 11.8 开课二个月零四天 (Jquery取属性值,做全选,去空格)

    1.jquery取复选框的值 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...

  3. 由于未能创建 Microsoft Visual C# 2008 编译器,因此未能打开项目 "..."的解决方法

    如果遇到这种问题,我们通常只要在 Visual Studio 2017 的命令提示符工具里执行下列命令即可: devenv /resetskippkgs 如果还是不行的话,可以先把 Visual St ...

  4. libgdx学习记录22——3d物体创建

    libgdx是一个强大的游戏框架,不仅支持2d部分,同时还支持3d部分. libgdx的3d部分投影主要通过PerspectiveCamera实现. 物体的显示过程: 1. 创建远景相机,角度一般设为 ...

  5. TFS2012独占签出设置

    说明:TFS2012默认是可以多人签出同一个文件.如果要设为独占签出,请看下面操作步骤 1. 2. 3. 然后选择工作区---编辑---高级.最后如下图,在位置那里选择服务器. END

  6. stl源码剖析 详细学习笔记 set map

    // //  set map.cpp //  笔记 // //  Created by fam on 15/3/23. // // //---------------------------15/03 ...

  7. GitHub 新手教程 六,Git GUI 新手教程(3),从GitHub远端同步代码库

    从GitHub把代码库下载到本地: 1,打开 GitGUI,单击我们之前克隆好的本地库: 2,按图片所示点击,同步远端代码: 3,出现如下提示后,点击“Close”: 4,上面只是把代码下载下来,还没 ...

  8. PAT甲题题解-1005. Spell It Right (20)-数位求和,水

    把每个位上的数字求和sum,然后以英文单词的形式输出sum的每个位 #include <iostream> #include <cstdio> #include <alg ...

  9. Linux内核分析 实验一 ——by王玥

    一.实验内容 1)实验部分(以下命令为实验楼64位Linux虚拟机环境下适用,32位Linux环境可能会稍有不同) 使用 gcc –S –o main.s main.c -m32 命令编译成汇编代码, ...

  10. iOS-copy与mutableCopy浅析

    iOS-copy与mutableCopy浅析 iOS 浅谈:深.浅拷贝与copy.strong 总结:当不可变类型对象调用copy拷贝后,不会产生新的对象,属于浅拷贝,其他类型对象不管调用copy亦或 ...