自定義元類控制類的建立
class mymeta(type):
def __init__(self, class_name, class_bases, class_dic):
if not class_name.istitle():
raise typeerror('類名首字母必須大寫')
if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
raise typeerror('必須有注釋且注釋必須不能為空')
super().__init__(class_name, class_bases, class_dic)
class chinese(object, metaclass=mymeta):
'''***
'''country = 'china'
def __init__(self, name, age):
self.name = name
self.age = age
def talk(self):
print('%s is talking' % self.name)
# chinese = mymeta(class_name, class_bases, class_dic)
自定義元類控制類的例項化行為
# 知識儲備:__call__方法
class foo:
def __call__(self, *args, **kwargs):
print(self)
print(args)
print(kwargs)
obj = foo()
obj(1,2,3,a=1,b=2,c=3) # obj.__call__(obj,1,2,3,a=1,b=2,c=3)
# 元類內部也應該有乙個__call__方法,會在呼叫foo時觸發執行
# foo(1,2,x=1) # foo.__call__(1,2,x=1)
自定義元類控制類的例項化行為的應用
實現方式一:
# 單例模式
class mysql:
__instance = none
def __init__(self):
self.host = '127.0.0.1'
self.port = 3306
@classmethod
def singleton(cls):
if not cls.__instance:
obj = cls()
cls.__instance = obj
return cls.__instance
obj1 = mysql.singleton()
obj2 = mysql.singleton()
obj3 = mysql.singleton()
print(obj1)
print(obj2)
print(obj3)
# <__main__.mysql object at 0x1045a13c8>
# <__main__.mysql object at 0x1045a13c8>
# <__main__.mysql object at 0x1045a13c8>
實現方式二:
# 元類的方式
class mymeta(type):
def __init__(self, class_name, class_bases, class_dic):
if not class_name.istitle():
raise typeerror('類名首字母必須大寫')
if '__doc__' not in class_dic or not class_dic['__doc__'].strip():
raise typeerror('必須有注釋且注釋必須不能為空')
super().__init__(class_name, class_bases, class_dic)
self.__instance = none
def __call__(self, *args, **kwargs):
if not self.__instance:
obj = object.__new__(self)
self.__init__(obj)
self.__instance = obj
return self.__instance
class mysql(object,metaclass=mymeta):
'''***x
'''def __init__(self):
self.host = '127.0.0.1'
self.port = 3306
obj1 = mysql()
obj2 = mysql()
obj3 = mysql()
print(obj1 is obj2 is obj3)
python3元類 python3元類的呼叫順序
在嘗試理解元類建立類例項的順序時,我感到困惑.根據該圖 source 我鍵入以下 進行驗證.class meta type def call self print meta call super meta,self call def new mcs,name,bases,attrs,kwargs p...
Python3 元類程式設計
在python中一切接物件,類也是乙個物件,所有的類都是有type類建立,我們實際開發中最常用的type方法,是用來獲取某個物件的型別的,例如type 1 int type str str。但是type還有一種用法,就是用來建立類的。1 通過type動態建立無父類 無屬性的類people type ...
python3元組 Python3元組
python的元組與列表相似,不同之處在於元組的元素不能修改 元組使用小括號,列表使用方括號 元組建立很簡單,只需要在括號中新增元素,並使用逗號隔開即可。建立空元組 tup1 tup2 1,元組只包含乙個元素時,需要在元素後面新增逗號,否則括號會被當作運算子使用 元組與字串類似,下標索引從0開始,可...