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解析xml文件实例分享
Dec 04 Python
Python中的并发编程实例
Jul 07 Python
玩转python爬虫之URLError异常处理
Feb 17 Python
Python网络爬虫项目:内容提取器的定义
Oct 25 Python
python数据结构之链表的实例讲解
Jul 25 Python
对pandas的dataframe绘图并保存的实现方法
Aug 05 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 Python
python监控nginx端口和进程状态
Sep 06 Python
Python实现投影法分割图像示例(一)
Jan 17 Python
python十进制转二进制的详解
Feb 07 Python
python操作链表的示例代码
Sep 27 Python
Pytorch数据读取之Dataset和DataLoader知识总结
May 23 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
世界第一个无线广播电台 KDKA
2021/03/01 无线电
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
php Memcache 中实现消息队列
2009/11/24 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
JS不用正则验证输入的字符串是否为空(包含空格)的实现代码
2016/06/14 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
ajax异步请求详解
2017/01/06 Javascript
vue2中使用less简易教程
2018/03/27 Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
2018/10/31 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
[05:45]Ti4观战指南(下)
2014/07/07 DOTA
python getopt 参数处理小示例
2009/06/09 Python
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
python 动态绘制爱心的示例
2020/09/27 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
css3 border-radius属性详解
2017/07/05 HTML / CSS
荷兰优雅女装网上商店:Heine
2016/11/14 全球购物
美国围栏公司:Walpole Outdoors
2019/11/19 全球购物
建筑工程专业大学生求职信
2014/04/23 职场文书
《秋游》教学反思
2014/04/24 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
财政局长个人总结
2015/03/04 职场文书
运动会广播稿300字
2015/08/19 职场文书
nginx优化的六点方法
2021/03/31 Servers
java调用Restful接口的三种方法
2021/08/23 Java/Android