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实现巡检系统(solaris)示例
Apr 02 Python
python根据出生日期获得年龄的方法
Mar 31 Python
django之session与分页(实例讲解)
Nov 13 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
详解Django rest_framework实现RESTful API
May 24 Python
python 拼接文件路径的方法
Oct 23 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
Jun 10 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
Jun 20 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
Python Websocket服务端通信的使用示例
Feb 25 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
Oct 04 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 excel类 phpExcel使用方法介绍
2010/08/21 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
JavaScript多线程详解
2015/08/12 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
JS验证邮件地址格式方法小结
2015/12/01 Javascript
js实现div模拟模态对话框展现URL内容
2016/05/27 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
vue中实现滚动加载更多的示例
2017/11/08 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
Python3基础之函数用法
2014/08/13 Python
tensorflow构建BP神经网络的方法
2018/03/12 Python
python 使用re.search()筛选后 选取部分结果的方法
2018/11/28 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
Python shelve模块实现解析
2019/08/28 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
Python实现自动装机功能案例分析
2020/10/22 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
财务与信息服务专业推荐信
2013/11/28 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
主持人大赛开场白
2015/05/29 职场文书
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS