Python进阶:一步步理解Python中的元类metaclass

"xianhu")print(foo.hello())print(Foo.cls_var)

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)