zoukankan      html  css  js  c++  java
  • python singleton design pattern super() 多继承

    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

  • 相关阅读:
    天大复试机试练习_003
    C++随手记--字符串转数字
    C++标准库STL 之 我觉得应该有的方法——split
    apt-get 详解&&配置阿里源
    Nginx 图文详解
    MySQL数据库管理常用命令小结
    oracle数据库备份
    SqlServer数据库备份还原步骤
    mysql数据备份与恢复
    Tomcat架构
  • 原文地址:https://www.cnblogs.com/yuyang26/p/7717571.html
Copyright © 2011-2022 走看看