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 = Nonedef __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 = nameprint(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):passdef f1(self):print('f.f1')class G(D,F):# def f1(self):# print('g.f1')passinsta = G() insta.f1() #打印出f.f1?
?
?
轉載于:https://www.cnblogs.com/yuyang26/p/7717571.html
總結
以上是生活随笔為你收集整理的python singleton design pattern super() 多继承的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《JavaScript高级程序设计》Ch
- 下一篇: 第一次ScrumMeeting博客:团队