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中遍历文件的3个方法
Sep 02 Python
Python学习之asyncore模块用法实例教程
Sep 29 Python
python 查找字符串是否存在实例详解
Jan 20 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
python 提取key 为中文的json 串方法
Dec 31 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
int在python中的含义以及用法
Jun 27 Python
Python魔法方法 容器部方法详解
Jan 02 Python
Python实现Word表格转成Excel表格的示例代码
Apr 16 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
PyCharm+PyQt5+QtDesigner配置详解
Aug 12 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
PHP的FTP学习(一)
2006/10/09 PHP
isset和empty的区别
2007/01/15 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
php实现的操作excel类详解
2016/01/15 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
原生js事件的添加和删除的封装
2014/07/01 Javascript
Jquery效果大全之制作电脑健康体检得分特效附源码下载
2015/11/02 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
Node.js的特点详解
2017/02/03 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
用Nodejs搭建服务器访问html、css、JS等静态资源文件
2017/04/28 NodeJs
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
Vue封装的可编辑表格插件方法
2018/08/28 Javascript
vue安装和使用scss及sass与scss的区别详解
2018/10/15 Javascript
JS求解两数之和算法详解
2020/04/28 Javascript
Vue中使用wangeditor富文本编辑的问题
2021/02/07 Vue.js
python自然语言编码转换模块codecs介绍
2015/04/08 Python
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
Django中对数据查询结果进行排序的方法
2015/07/17 Python
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
TensorFlow利用saver保存和提取参数的实例
2018/07/26 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Python中collections模块的基本使用教程
2018/12/07 Python
python爬取微信公众号文章的方法
2019/02/26 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
优秀中专生推荐信
2013/11/17 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
纯html+css实现Element loading效果
2021/08/02 HTML / CSS