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原始套接字编程示例分享
Feb 21 Python
Python利用Beautiful Soup模块搜索内容详解
Mar 29 Python
Django中ORM表的创建和增删改查方法示例
Nov 15 Python
Python模拟脉冲星伪信号频率实例代码
Jan 03 Python
python验证码识别实例代码
Feb 03 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 Python
python使用配置文件过程详解
Dec 28 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
Python装饰器的应用场景代码总结
Apr 10 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
python 将Excel转Word的示例
Mar 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
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
教你在header中隐藏php的版本信息
2016/08/10 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
为开发者准备的10款最好的jQuery日历插件
2014/02/04 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
vue遍历生成的输入框 绑定及修改值示例
2019/10/30 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
[41:05]Serenity vs Pain 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python的print用法示例
2014/02/11 Python
Python生成验证码实例
2014/08/21 Python
Python中实现两个字典(dict)合并的方法
2014/09/23 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
python基础教程项目二之画幅好画
2018/04/02 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
护士在校生自荐信
2014/02/01 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Vue如何实现组件间通信
2021/05/15 Vue.js