1. 程式人生 > >自定義元類控制類的實例化行為的應用

自定義元類控制類的實例化行為的應用

初始化 對象 1.2 .post 進行 應用 return **kwargs 控制

#實現方式一
class Mysql:
__instance = None # __instance = s
def __int__(self):
self.post = 1.235
self.host = 3
@classmethod
def singleton(cls):
if not cls.__instance:
obj = cls()
cls.__instance = obj
return cls.__instance
def talk(self):
pass
def func(self):
pass
s = Mysql.singleton()
d = Mysql.singleton()
f = Mysql.singleton()
a = Mysql.singleton()
print(s is a)

‘‘‘
這是單例模式, 如果每個對象中的屬性相同, 就可以用這種辦法,每次用類去調用類的函數屬性進行執行
首次執行會把__instance = obj 自此以後就會把這個類的變量屬性返回給其他的對象,因此無論產生再多的對象他們都是使用的第一個對象
‘‘‘

#實現方式二
class Mymeta(type):
def __init__(self, class_name, class_bases, class_dic):
super(Mymeta, self).__init__(class_name, class_bases, class_dic)
self.__instance = None
print(self)
def __call__(self, *args, **kwargs):
if not self.__instance:
obj = object.__new__(self)
self.__init__(obj)
self.__instance = obj
print(self)
return self.__instance

class Mysql(object, metaclass=Mymeta):
def __int__(self):
self.post = 1.235
self.host = 3
def talk(self):
pass
def func(self):
pass

s = Mysql()
d = Mysql()
f = Mysql()
print(s is f)
‘‘‘
元類也可以實現單例模式,同時還是需要遵循__call__裏面的三原則:生產對象,初始化對象,返回對象
此時我們在Mysql的自定義元類的Mymeta裏面為Mysql的對象self生成一個空屬性__instance = None ,此時我們
定義的Mysql類如果實例化就會激活__call__ 隨之我們在__casll__裏面進行單例模式的實現, 判斷__instance是否為空, 如果空我們就開始創建空對象,隨之我們需要對空對象實例化,然後把空對形象賦值給__instance最後返回給其他外部要實例化的對象

‘‘‘


自定義元類控制類的實例化行為的應用