日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python----面向对象---自定义元类控制类的实例化行为的应用

發布時間:2023/11/29 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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----面向对象---自定义元类控制类的实例化行为的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。