python 经过元类控制类的建立

1、python中如何建立类?

1. 直接定义类

class A:
   a = 'a'

 

2. 经过type对象建立

在python中一切都是对象python

在上面这张图中,A是咱们日常在python中写的类,它能够建立一个对象a。其实A这个类也是一个对象,它是type类的对象,能够说type类是用来建立类对象的类,咱们日常写的类都是type类建立的对象,再由建立的对象再去建立咱们日常使用的对象,咱们能够看看type的官方文档编程

type(object_or_name, bases, dict)
type(object) -> the object's type
type(name, bases, dict) -> a new type

type有另外一种用法type(name, bases, dict)来建立类 中,name是这个类的名字,bases是这个类的基类(是一个元组),dict是这个类的属性(是一个字典),咱们经过type实现上面的例子中A类的建立spa

A = type('A', (), {'a': 'a'})

 

2、什么是元类编程?

咱们已经知道,类也是对象,那么咱们在建立类的时候,可不能够控制类的建立过程?固然是能够的,这就是元类编程。code

3、如何实现元类编程?

1. 在要定义的类中使用__new__方法

class A:
    def __new__(cls, *args, **kwargs):
        cls.a = 'a'
        return super().__new__(cls, *args, **kwargs)

 

这样就实现了建立A类的时候,添加了一个类属性a(注意的是,__new__方法要返回一个建立的对象,固然,咱们也能够返回其余东西;另外一个注意点是__new__方法要在实例化的时候才会运行,因此,类属性a必须是在A实例化后才会出现)对象

2. 使用metaclass关键字,使用metaclass关键字的时候,咱们要定义一个type类

class B(type):
    def __init__(self, *args, **kwargs):
        self.a = 'a'
        super().__init__(*args, **kwargs)


class A(metaclass=B):
    pass

 

咱们定义了一个B类继承type,在A类建立的时候传递关键字metaclass=B,就会执行B类种的代码,控制A类的建立,这个例子也是为A类添加了一个类属性a。咱们还能够在B类中使用__init__,__call__方法。blog

4、python中元类编程执行的顺序

class MetaClass(type):
    # 定义A类的时候就会调用
    def __init__(self, *args, **kwargs):
        print('MetaClass __init__')
        super().__init__(*args, **kwargs)

    # 定义A类的时候,就会调用
    def __new__(cls, *args, **kwargs):
        print('MetaClass __new__')
        # *args 里面包含了建立A类的参数
        return super().__new__(cls, *args, **kwargs)

    # A实例化的时候才会去调用call
    def __call__(self, *args, **kwargs):
        print('MetaClass __call__')
        # 这儿实际上是去调用A类须要实例化的全部方法
        return super().__call__(*args, **kwargs)


class A(metaclass=MetaClass):
    def __init__(self):
        print('A __init__')

    def __new__(cls, *args, **kwargs):
        print('A __new__')
        return super().__new__(cls, *args, **kwargs)


a = A()


# 输出
MetaClass __new__
MetaClass __init__
MetaClass __call__
A __new__
A __init__

 

5、总结

使用元类编程可让咱们在建立类的时候,给类添加一些额外的信息。但元类编程是python中难以理解的地方之一,并且工做中,大部分时候都是不会用到的,咱们普通的类定义方式就能够解决问题了,若果说有99%的时候你须要控制建立类的过程,那就使用元类编程吧。继承

理解元类,你们能够参考这篇文章  what are metaclass in python?文档

相关文章
相关标签/搜索