这个非常的不常用,但是像ORM这种复杂的结构还是会需要的,详情请看:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python
元类最常用作类工厂。当通过调用类创建对象时,Python通过调用元类来创建一个新类(当执行“ class”语句时)。因此,将元类与常规方法__init__
和__new__
方法结合使用,可以使您在创建类时做“额外的事情”,例如在某些注册表中注册新类或将其完全替换为其他类。
class
执行该语句时,Python首先将class
语句的主体作为普通代码块执行。生成的名称空间(一个dict)保存了将来类的属性。通过查看要成为类的基类(继承了元类),要成为__metaclass__
的类(如果有)的属性或__metaclass__
全局变量来确定元类。然后使用该类的名称,基数和属性调用该元类以实例化它。
但是,元类实际上定义了类的类型,而不仅仅是它的工厂,因此您可以使用它们做更多的事情。例如,您可以在元类上定义常规方法。这些元类方法就像类方法,因为它们可以在没有实例的情况下在类上调用,但是它们也不像类方法,因为它们不能在类的实例上被调用。type.__subclasses__()
是type
元类上方法的示例。您还可以定义正常的“魔力”的方法,如__add__
,__iter__
和__getattr__
,执行或更改类的行为。
类是用来定义对象的,那么元类是什么?
元类是一种,创建,修改类的一种技术
(通俗地说他是一个类管理员)添加,删除类的属性以及方法
class CreateClass(type): def __new__(cls, classname, superclass, params_dict): # 操作我们的类的属性 del params_dict['num'] del params_dict['set_name']# 删除类的属性和方法 params_dict['my_num'] = 20000 return super().__new__(cls, classname, superclass, params_dict) # 让我们的student类的创建让我们的createclass创建 class Student(object, metaclass=CreateClass): num = 100 def __init__(self): self.name = None def set_name(self, name): self.name = name student = Student() student.set_name('name') print(student.my_num)
>Traceback (most recent call last):
>student.set_name('name') > AttributeError: 'Student' object has no attribute 'set_name'
元类可以创建类
class A(object): passa = A() print(a.__class__) print(a.__class__.__class__) print(a.__class__.__class__.__class__) # A # type # type