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的SQLAlchemy框架使用入门
Apr 29 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
python图片验证码生成代码
Jul 02 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
Dec 12 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
Mar 01 Python
Python中按值来获取指定的键
Mar 04 Python
用python画一只可爱的皮卡丘实例
Nov 21 Python
在django admin详情表单显示中添加自定义控件的实现
Mar 11 Python
Python第三方库安装缓慢的解决方法
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
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
thinkphp分页集成实例
2017/07/24 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
JS获取整个页面文档的实现代码
2011/12/15 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
JavaScript入门基础
2015/08/12 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
jQuery异步提交表单的两种方式
2016/09/13 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
vue表单自定义校验规则介绍
2018/08/28 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
python使用response.read()接收json数据的实例
2018/12/19 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
应用心理学个人的求职信
2013/12/08 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
高一新生军训方案
2014/05/12 职场文书
疾病捐款倡议书
2014/05/13 职场文书
奥运会口号
2014/06/13 职场文书
公司授权委托书范文
2014/09/21 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
高中数学教学反思范文
2016/02/18 职场文书
五年级作文之成长
2019/09/16 职场文书
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python