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聊天室实现方法
Jun 28 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
Python探索之修改Python搜索路径
Oct 25 Python
python交互式图形编程实例(三)
Nov 17 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
python使用多线程编写tcp客户端程序
Sep 02 Python
使用Python求解带约束的最优化问题详解
Feb 11 Python
Python 找出出现次数超过数组长度一半的元素实例
May 11 Python
Python如何实现爬取B站视频
May 20 Python
Django3中的自定义用户模型实例详解
Aug 23 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
PHP开发过程中常用函数收藏
2009/12/14 PHP
PHP程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
jquery实用代码片段集合
2010/08/12 Javascript
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
2015/07/27 Javascript
在JavaScript中模拟类(class)及类的继承关系
2016/05/20 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
javascrpt密码强度校验函数详解
2020/03/18 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
python下MySQLdb用法实例分析
2015/06/08 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
python如何使用代码运行助手
2020/07/03 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
大学生职业规划前言模板
2013/12/27 职场文书
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
英语教师个人总结
2015/02/09 职场文书
经营场所使用证明
2015/06/19 职场文书
如何在Python项目中引入日志
2021/05/31 Python
海弦WR-800F
2022/04/05 无线电