python元类
前置知识,type创建类
metaclass
class ListMetaClass(type):
def __new__(cls, class_name, bases_tuple, namespace_dict):
namespace_dict["add"] = lambda self, x: self.append(x)
return type.__new__(cls, class_name, bases_tuple, namespace_dict)
class MyList(list, metaclass=ListMetaClass):
pass
先简单理解下,通常类是由type.__new__
创建的,而ListMetaClass类继承自type,并通过覆盖type.__new__
方法(给命名空间增加了一个add方法,其余不变),实现基于ListMetaClass创建的类都带有add方法。
如果创建类是增加metaclass=xxx参数,则python解释器在创建MyList时,不是通过type.__new__
创建,而是通过xxx.__new__
来创建。
__new__
函数需要接收四个参数:
- cls
- 类名(会成为
类.__name__
的属性值) - 继承的基类元组
- 函数和变量的命名空间字典(注意实例的函数需要传入self参数)
另外需要注意的是:mateclass=***
可以隐式的继承到子类