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 04 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
python实现NB-IoT模块远程控制
Jun 20 Python
Python用61行代码实现图片像素化的示例代码
Dec 10 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
Python实现Linux监控的方法
May 16 Python
在pycharm下设置自己的个性模版方法
Jul 15 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
python tkinter canvas使用实例
Nov 04 Python
Tensorflow加载Vgg预训练模型操作
May 26 Python
call在Python中改进数列的实例讲解
Dec 09 Python
Python如何使用循环结构和分支结构
Apr 13 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解决URL中文GBK乱码问题的两种方法
2014/06/03 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
用js实现博客打赏功能
2016/10/24 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
[02:17]2016国际邀请赛中国区预选赛VG战队领队采访
2016/06/26 DOTA
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
node.js获取参数的常用方法(总结)
2017/05/29 Python
如何通过python实现全排列
2020/02/11 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
给民警的表扬信
2014/01/08 职场文书
小学生检讨书大全
2014/02/06 职场文书
员工廉洁自律承诺书
2014/05/26 职场文书
2014年国庆标语
2014/06/30 职场文书
公司领导班子对照材料
2014/08/18 职场文书
承诺书样本
2014/08/30 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
2015年度保密工作总结
2015/04/24 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
新店开张宣传语
2015/07/13 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
基于Python的EasyGUI学习实践
2021/05/07 Python
用JS实现飞机大战小游戏
2021/06/09 Javascript
Android studio 简单计算器的编写
2022/05/20 Java/Android
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS