什么是元类
在python
中,元类的关键字是metaclass
,翻译过来就是【元类】,元类可以用来控制类的创建过程,可以定义类的结构、属性和方法。
哎,你是不是感觉很熟悉呢? 因为我们之前的文章在介绍类继承和多态的时候提及过,上述功能继承也能实现,那为什么还需要元类呢?
在python
中,元类对类的创建过程可以进行更加细粒度的控制和定制,甚至于可以根据类的名称、属性值等,生成动态代码,这是继承无法比拟的。
类是如何被创建的
要搞清楚元类,我们首先要清楚,类是如何被创建的,我们一直使用的是传统的创建语法,例如:
class className(): def func(self,key,value): return key,value c = className() print(c.func("1","2"))
上述代码,我们创建了一个类,名字为className
,而后再创建了一个实例c
,使用c.func()
来调用类方法。最后结果是输出我们传入的值,如下:
除此之外,我们还可以使用type
函数来创建类,例如如上代码,可以修改为:
classFunc = { 'func': lambda self,x,y: (x , y) } className = type('className', (), classFunc) c = className() print(c.func("1","2"))
在上述代码中,我们使用type
函数创建了一个名为className
,属性中包含一个方法func
,该方法接收三个参数self
、x
以及y
,该方法的返回值是x
,y
。
我们执行后,结果如下:
元类如何创建
在python
中,一切皆对象,所以我们可以使用type
来创建一个类,这里会引出下面关于type
类的话题,注意一下哦,type()
是一个内置函数,用于获取对象的类型,或者创建一个新的类对象。但是type
是python
中的一个类,我们称之为元类,例如如下代码:
class classMeta(type): pass class className(metaclass=classMeta): pass c = className()
上述代码,我们将创建一个类classMeta
,它将继承type
类,而后我们定义类className
,我们将这个类的元类设置为classMeta
。最后再通过className
实例化一个类对象c
。
上述就是我们元类的创建过程了,为什么我们不直接使用classMeta
呢?如果直接使用,那我们先修改代码如下:
class classMeta(type): pass c = classMeta()
若我们执行后,会报错如下:
这是因为classMeta
继承于type
,而它本身就是一个元类,是用来创建其他类的,所以不能被实例化为一个类对象。
如果这么说,还不明白的话,我们可以来打印一下2个类的值,修改代码如下:
class classMeta(type): pass class className(metaclass=classMeta): pass print("classMeta 类型为: ",type(classMeta)) print("className 类型为:",type(className))
结果如下:
可以看到,一个是类型是type
,一个类型是我们创建的元类,所以说,直接调用type
会失败。
总结
本篇文章,介绍了什么是元类,以及元类的作用,而后单独介绍了类是如何被创建的,python
关键字可有点操蛋啊,对初学者而言,感觉非常不好,type
关键字,有双层含义:
- 内置方法使用: 会获取对象的类型,或者是创建一个类。
- 关键字使用: 它则代表一个元类。
所以第二段落,我们讲述了类是如何被创建的,主要介绍了使用class
方式和type()
2种方法,目的是探究类是如何被创建的,还有获取type
的用法,最后我们介绍了如何创建元类以及获取元类和类的类型。
如何定制化元类,我们将在下一篇开始介绍。