python中的元类metaclass

这个非常的不常用,但是像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
 
原文地址:https://www.cnblogs.com/originalTblog/p/11726273.html