Python----面向对象---自定义元类控制类的实例化行为的应用
生活随笔
收集整理的這篇文章主要介紹了
Python----面向对象---自定义元类控制类的实例化行为的应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、單例模式
1 class Mysql: 2 def __init__(self): 3 self.host = '127.0.0.1' 4 self.port = 3306 5 6 7 obj1 = Mysql() 8 obj2 = Mysql() 9 10 print(obj1) 11 print(obj2) 12 13 結果為: 14 15 <__main__.Mysql object at 0x0000021CBF4DB588> 16 <__main__.Mysql object at 0x0000021CBF4DB160>可以看出,兩個對象的內存地址不一樣,但是對象的屬性是一樣的,能不能只實例化一次,然后其它對象都引用它,就像a =1 b =1 ,,我們發現,他們指向的是同一塊內存地址,答案是可以的,這就是單例模式,
1 class Mysql: 2 __instance = None 3 4 def __init__(self): 5 self.host = '127.0.0.1' 6 self.port = 3306 7 8 @classmethod 9 def singleton(cls): 10 print(cls) 11 if not cls.__instance: 12 obj = cls() 13 cls.__instance = obj 14 return cls.__instance 15 16 def conn(self): 17 pass 18 19 def execute(self): 20 pass 21 22 23 # obj1 = Mysql() 24 # obj2 = Mysql() 25 # 26 # print(obj1) 27 # print(obj2) 28 29 obj1 = Mysql.singleton() 30 obj2 = Mysql.singleton() 31 obj3 = Mysql.singleton() 32 33 print(obj1 is obj2 is obj3) 34 35 結果為; 36 37 <class '__main__.Mysql'> 38 <class '__main__.Mysql'> 39 <class '__main__.Mysql'> 40 True以上就是實現單例模式的一種方式,class,下面介紹第二種方式,通過元類實現單例模式
?
實現方式2: 元類的方式
代碼如下:
?
1 class Mymeta(type): 2 def __init__(cls, class_name, class_bases, class_dic): 3 4 if not class_name.istitle(): 5 raise TypeError('類名的首字母必須大寫') 6 7 if '__doc__' not in class_dic or not class_dic['__doc__'].strip(): 8 raise TypeError('必須有注釋,且注釋不能為空') 9 10 super(Mymeta, cls).__init__(class_name, class_bases, class_dic) 11 cls.__instance = None 12 13 def __call__(cls, *args, **kwargs): 14 if not cls.__instance: 15 obj = object.__new__(cls) 16 cls.__init__(obj) 17 cls.__instance = obj 18 19 return cls.__instance 20 21 22 class Mysql(object, metaclass=Mymeta): 23 ''' 24 xxxx 25 ''' 26 def __init__(self): 27 self.host = '127.0.0.1' 28 self.port = 3306 29 30 def conn(self): 31 pass 32 33 def execute(self): 34 pass 35 36 37 obj1 = Mysql() 38 obj2 = Mysql() 39 obj3 = Mysql() 40 41 print(obj1 is obj2 is obj3) 42 43 結果為: 44 45 True結果為True,實現了單例模式
轉載于:https://www.cnblogs.com/xudachen/p/8666833.html
總結
以上是生活随笔為你收集整理的Python----面向对象---自定义元类控制类的实例化行为的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到大象生小象是什么意思
- 下一篇: 史上最全面,清晰的SharedPrefe