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的用法,最后我们介绍了如何创建元类以及获取元类和类的类型。


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





相关文章
|
4月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
9月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
241 11
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
609 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
10月前
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
254 1
|
10月前
|
Python
Python 高级编程与实战:深入理解面向对象与并发编程
本文深入探讨Python的高级特性,涵盖面向对象编程(继承、多态、特殊方法、类与实例属性)、异常处理(try-except、finally)和并发编程(多线程、多进程、异步编程)。通过实战项目如聊天服务器和异步文件下载器,帮助读者掌握这些技术,编写更复杂高效的Python程序。
|
Python
Python面向对象(2)
【10月更文挑战第14天】
191 6
Python面向对象(2)
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
152 2
Python面向对象
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
225 2

推荐镜像

更多