python 通过元类控制类的创建
一、python中如何创建类?
1. 直接定义类
class a:
a = 'a'
2. 通过type对象创建
在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类的创建
a = type('a', (), {'a': 'a'})
二、什么是元类编程?
我们已经知道,类也是对象,那么我们在创建类的时候,可不可以控制类的创建过程?当然是可以的,这就是元类编程。
三、如何实现元类编程?
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__方法。
四、总结
使用元类编程可以让我们在创建类的时候,给类添加一些额外的信息。但元类编程是python中难以理解的地方之一,而且工作中,大部分时候都是不会用到的,我们普通的类定义方式就可以解决问题了,若果说有99%的时候你需要控制创建类的过程,那就使用元类编程吧。
理解元类,大家可以参考这篇文章
上一篇: 快速排序python实现
下一篇: hashMap源码--JDK1.8