likes
comments
collection
share

python|面向对象-5|类是如何被创建的|初探元类

作者站长头像
站长
· 阅读数 15

什么是元类

python中,元类的关键字是metaclass,翻译过来就是【元类】,元类可以用来控制类的创建过程,可以定义类的结构、属性和方法。

哎,你是不是感觉很熟悉呢? 因为我们之前的文章在介绍类继承和多态的时候提及过,上述功能继承也能实现,那为什么还需要元类呢?

python中,元类对类的创建过程可以进行更加细粒度的控制和定制,甚至于可以根据类的名称、属性值等,生成动态代码,这是继承无法比拟的。

类是如何被创建的

要搞清楚元类,我们首先要清楚,类是如何被创建的,我们一直使用的是传统的创建语法,例如:

class className():
    def func(self,key,value):
        return key,value

c = className()
print(c.func("1","2"))

上述代码,我们创建了一个类,名字为className,而后再创建了一个实例c,使用c.func()来调用类方法。最后结果是输出我们传入的值,如下:

python|面向对象-5|类是如何被创建的|初探元类

除此之外,我们还可以使用type函数来创建类,例如如上代码,可以修改为:

classFunc = {
    'func': lambda self,x,y: (x , y)
}

className = type('className', (), classFunc)

c = className()
print(c.func("1","2"))

在上述代码中,我们使用type函数创建了一个名为className,属性中包含一个方法func,该方法接收三个参数selfx以及y,该方法的返回值是x,y

我们执行后,结果如下:

python|面向对象-5|类是如何被创建的|初探元类

元类如何创建

python中,一切皆对象,所以我们可以使用type来创建一个类,这里会引出下面关于type类的话题,注意一下哦,type()是一个内置函数,用于获取对象的类型,或者创建一个新的类对象。但是typepython中的一个类,我们称之为元类,例如如下代码:

class classMeta(type):
    pass

class className(metaclass=classMeta):
    pass

c = className()

上述代码,我们将创建一个类classMeta,它将继承type类,而后我们定义类className,我们将这个类的元类设置为classMeta。最后再通过className实例化一个类对象c

上述就是我们元类的创建过程了,为什么我们不直接使用classMeta呢?如果直接使用,那我们先修改代码如下:

class classMeta(type):
    pass

c = classMeta()

若我们执行后,会报错如下:

python|面向对象-5|类是如何被创建的|初探元类

这是因为classMeta继承于type,而它本身就是一个元类,是用来创建其他类的,所以不能被实例化为一个类对象。

如果这么说,还不明白的话,我们可以来打印一下2个类的值,修改代码如下:

class classMeta(type):
    pass

class className(metaclass=classMeta):
    pass

print("classMeta 类型为: ",type(classMeta))
print("className 类型为:",type(className))

结果如下:

python|面向对象-5|类是如何被创建的|初探元类

可以看到,一个是类型是type,一个类型是我们创建的元类,所以说,直接调用type会失败。

总结

本篇文章,介绍了什么是元类,以及元类的作用,而后单独介绍了类是如何被创建的,python关键字可有点操蛋啊,对初学者而言,感觉非常不好,type关键字,有双层含义:

  • 内置方法使用: 会获取对象的类型,或者是创建一个类。
  • 关键字使用: 它则代表一个元类。

所以第二段落,我们讲述了类是如何被创建的,主要介绍了使用class方式和type()2种方法,目的是探究类是如何被创建的,还有获取type的用法,最后我们介绍了如何创建元类以及获取元类和类的类型。

如何定制化元类,我们将在下一篇开始介绍。