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的Tornado框架实现一个简单的WebQQ机器人
Apr 24 Python
python3使用pyqt5制作一个超简单浏览器的实例
Oct 19 Python
新手常见6种的python报错及解决方法
Mar 09 Python
Python对多属性的重复数据去重实例
Apr 18 Python
python实现对求解最长回文子串的动态规划算法
Jun 02 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
浅述python中深浅拷贝原理
Sep 18 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
python实现数据清洗(缺失值与异常值处理)
Dec 02 Python
Python用access判断文件是否被占用的实例方法
Dec 17 Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 Python
python wsgiref源码解析
Feb 06 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
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
PHP+JS+rsa数据加密传输实现代码
2011/03/23 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP实现百度人脸识别
2019/05/06 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
简单实例处理url特殊符号&amp;处理(2种方法)
2013/04/02 Javascript
jquery异步跨域访问代码
2013/06/28 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
原生js实现类似fullpage的单页/全屏滚动
2017/01/22 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
vue-openlayers实现地图坐标弹框效果
2020/09/24 Javascript
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python TestCase中的断言方法介绍
2019/05/02 Python
Python3实现zip分卷压缩过程解析
2019/10/09 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
Python基于WordCloud制作词云图
2019/11/29 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
PyTorch的torch.cat用法
2020/06/28 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
处理HTML5新标签的浏览器兼容版问题
2017/03/13 HTML / CSS
瑞士香水购物网站:Parfumcity.ch
2017/01/14 全球购物
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
停车场管理协议书范本
2014/10/08 职场文书
个园导游词
2015/02/04 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
Java实现多线程聊天室
2021/06/26 Java/Android