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中的数据存储到系统本地的简单方法
Apr 11 Python
Python入门之modf()方法的使用
May 15 Python
基于Python实现文件大小输出
Jan 11 Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 Python
利用python脚本如何简化jar操作命令
Feb 24 Python
python实现月食效果实例代码
Jun 18 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
django 捕获异常和日志系统过程详解
Jul 18 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
python实现猜单词游戏
May 22 Python
记录一下scrapy中settings的一些配置小结
Sep 28 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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php安全之直接用$获取值而不$_GET 字符转义
2012/06/03 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
Javascript this指针
2009/07/30 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
layui实现根据table数据判断按钮显示情况的方法
2019/09/26 Javascript
vue 取出v-for循环中的index值实例
2019/11/09 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
Python实现二分查找算法实例
2015/05/26 Python
python执行子进程实现进程间通信的方法
2015/06/02 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
夏季奶茶店创业计划书
2014/01/16 职场文书
经济管理专业求职信
2014/06/09 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
小学老师对学生的评语
2014/12/29 职场文书
爱心捐书倡议书
2015/04/27 职场文书
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android