Python基础之元类详解


Posted in Python onApril 29, 2021

1.python 中一切皆是对象,类本身也是一个对象,当使用关键字 class 的时候,python 解释器在加载 class 的时候会创建一个对象(这里的对象指的是类而非类的实例)

class Student:
    pass
 
s = Student()
print(type(s))  # <class '__main__.Student'>
print(type(Student))  # <class 'type'>

2.什么是元类

元类是类的类,是类的模板
元类是用来控制如何创建类的,正如类是创建对象的模板一样
元类的实例为类,正如类的实例为对象。
type 是python 的一个内建元类,用来直接控制生成类,python中任何 class 定义的类其实是 type 类实例化的对象

3.创建类的两种方法:

# 方法一
class Student:
    def info(self):
        print("---> student info")
 
# 方法二
def info(self):
    print("---> student info")
 
Student = type("Student", (object,), {"info": info, "x": 1})

4.一个类没有声明自己的元类,默认其元类是 type, 除了使用元类 type, 用户也可以通过继承 type 来自定义元类

class Mytype(type):
    def __init__(self, a, b, c):
        print("===》 执行元类构造方法")
        print("===》 元类__init__ 第一个参数:{}".format(self))
        print("===》 元类__init__ 第二个参数:{}".format(a))
        print("===》 元类__init__ 第三个参数:{}".format(b))
        print("===》 元类__init__ 第四个参数:{}".format(c))
 
    def __call__(self, *args, **kwargs):
        print("=====》 执行元类__call__方法")
        print("=====》 元类__call__ args:{}".format(args))
        print("=====》 元类__call__ kwargs:{}".format(kwargs))
        obj = object.__new__(self)  # object.__new__(Student)
        self.__init__(obj, *args, **kwargs)  # Student.__init__(s, *args, **kwargs)
        return obj
 
 
class Student(metaclass=Mytype):  # Student=Mytype(Student, "Student", (), {}) ---> __init__
    def __init__(self, name):
        self.name = name  # s.name=name
 
print("Student类:{}".format(Student))
s = Student("xu")
print("实例:{}".format(s))
 
# 结果:
#     ===》 执行元类构造方法
#     ===》 元类__init__ 第一个参数:<class '__main__.Student'>
#     ===》 元类__init__ 第二个参数:Student
#     ===》 元类__init__ 第三个参数:()
#     ===》 元类__init__ 第四个参数:{'__module__': '__main__', '__qualname__': 'Student', '__init__': <function Student.__init__ at 0x00000269BCA9A670>}
#     Student类:<class '__main__.Student'>
#     =====》 执行元类__call__方法
#     =====》 元类__call__ args:('xu',)
#     =====》 元类__call__ kwargs:{}
#     实例:<__main__.Student object at 0x00000269BC9E8400>

到此这篇关于Python基础之元类详解的文章就介绍到这了,更多相关Python元类详解内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python发送邮件接收邮件示例分享
Jan 21 Python
python改变日志(logging)存放位置的示例
Mar 27 Python
python求列表交集的方法汇总
Nov 10 Python
python与C互相调用的方法详解
Jul 14 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
Nov 06 Python
微信跳一跳python代码实现
Jan 05 Python
python开启摄像头以及深度学习实现目标检测方法
Aug 03 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
Python全面分析系统的时域特性和频率域特性
Feb 26 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
将Python代码打包成.exe可执行文件的完整步骤
May 12 Python
深入理解pytorch库的dockerfile
Jun 10 Python
教你怎么用Python监控愉客行车程
Django程序的优化技巧
Apr 29 #Python
教你怎么用Python实现多路径迷宫
python3.9之你应该知道的新特性详解
Apr 29 #Python
Python基础之tkinter图形化界面学习
Apr 29 #Python
Django cookie和session的应用场景及如何使用
Apr 29 #Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 #Python
You might like
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
php中实现获取随机数组列表的自定义函数
2015/04/02 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
jQuery常用操作方法及常用函数总结
2014/06/19 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
2017/07/03 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
python调用fortran模块
2016/04/08 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
解决python 无法加载downsample模型的问题
2018/10/25 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
毕业生精彩的自我评价分享
2013/10/06 职场文书
档案管理员岗位职责
2013/12/01 职场文书
残疾人小组计划书
2014/04/27 职场文书
大气污染防治方案
2014/05/19 职场文书
银行业务授权委托书
2014/10/10 职场文书
党员争先创优承诺书
2015/01/20 职场文书
公司宣传语大全
2015/07/13 职场文书
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫
python中 .npy文件的读写操作实例
2022/04/14 Python