Python3 元類拓展

2021-08-25 02:23:36 字數 2467 閱讀 5634

自定義元類控制類的建立

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開始,可...