4. 自定義元類
再一次說明實(shí)例、類和元類之間的關(guān)系:
>>> foo.__class__ # <class 'Foo'>>>> Foo.__class__ # <class 'type'>>>> type.__class__ # <class 'type'>
foo是Foo的實(shí)例,F(xiàn)oo是type的實(shí)例,type的類又是type。type是默認(rèn)的元類。那么如何自定義元類呢?(注意,百分之99的工程中不會(huì)用到自定義元類,除非你對(duì)元類非常理解)
舉個(gè)例子,假設(shè)我們需要對(duì)一個(gè)模塊中的所有函數(shù)添加作者屬性。首先自定義一個(gè)元類,自定義時(shí),需要繼承默認(rèn)元類type,并重寫其中的__new__方法:
class Author(type): def __new__(mcs, name, bases, dict): # 添加作者屬性 dict["author"] = "xianhu" return super(Author, mcs).__new__(mcs, name, bases, dict)
對(duì)模塊中所有函數(shù)的繼承類參數(shù)中添加metaclass參數(shù):
class Foo(object, metaclass=Author): passfoo = Foo()print(foo.author)