pythonsingleton design pattern super() 多继承

it2022-05-09  38

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 classAuto-magically covers inheritanceUses __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'    passclass F(B):    #pass    def foo(self):        print 'F'        passclass 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): pass def f1(self): print('f.f1') class G(D,F): # def f1(self): # print('g.f1') pass insta = G() insta.f1() #打印出f.f1

 

 

 

转载于:https://www.cnblogs.com/yuyang26/p/7717571.html


最新回复(0)