4. 自定义元类
再一次说明实例、类和元类之间的关系:
>>> foo.__class__ # <class 'Foo'>>>> Foo.__class__ # <class 'type'>>>> type.__class__ # <class 'type'>
foo是Foo的实例,Foo是type的实例,type的类又是type。type是默认的元类。那么如何自定义元类呢?(注意,百分之99的工程中不会用到自定义元类,除非你对元类非常理解)
举个例子,假设我们需要对一个模块中的所有函数添加作者属性。首先自定义一个元类,自定义时,需要继承默认元类type,并重写其中的__new__方法:
class Author(type): def __new__(mcs, name, bases, dict): # 添加作者属性 dict["author"] = "xianhu" return super(Author, mcs).__new__(mcs, name, bases, dict)
对模块中所有函数的继承类参数中添加metaclass参数:
class Foo(object, metaclass=Author): passfoo = Foo()print(foo.author)