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

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

什么是元类


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


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


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



类是如何被创建的


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

class className():
    def func(self,key,value):
        return key,value
c = className()
print(c.func("1","2"))

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

image.png


除此之外,我们还可以使用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


我们执行后,结果如下:

image.png



元类如何创建


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()

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

image.png


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


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

class classMeta(type):
    pass
class className(metaclass=classMeta):
    pass
print("classMeta 类型为: ",type(classMeta))
print("className 类型为:",type(className))

结果如下:

image.png

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



总结


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


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

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


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





相关文章
|
2月前
|
Java 程序员 C++
Python 面向对象详解!
本文详细介绍了Python中的面向对象编程(OOP),包括类、对象、继承、封装、多态和抽象等核心概念。通过具体示例,解释了如何使用类定义对象的属性和方法,以及如何通过继承实现代码重用。文章还探讨了封装和多态的重要性,并介绍了私有属性和抽象类的使用方法。最后,总结了OOP的四大支柱:封装、抽象、继承和多态,强调了这些概念在Python编程中的应用。适合Java程序员扩展Python编程知识。
77 2
|
2月前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
Python面向对象(2)
|
2月前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
Python面向对象
|
2月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
23 1
|
2月前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
26 2
|
2月前
|
设计模式 开发者 Python
Python类里引用其他类
Python类里引用其他类
28 4
|
2月前
|
设计模式 开发者 Python
Python 类中引用其他类的实现详解
Python 类中引用其他类的实现详解
46 1
|
2月前
|
JSON 缓存 API
在 Python 中使用公共类处理接口请求的响应结果
在 Python 中使用公共类处理接口请求的响应结果
36 1
WK
|
2月前
|
Python
Python类命名
在Python编程中,类命名至关重要,影响代码的可读性和维护性。建议使用大写驼峰命名法(如Employee),确保名称简洁且具描述性,避免使用内置类型名及单字母或数字开头,遵循PEP 8风格指南,保持项目内命名风格一致。
WK
17 0
|
2月前
|
开发者 Python
Python中的元类深度剖析与实战应用
Python中的元类深度剖析与实战应用
29 0