当前位置:网站首页>(十一)元类
(十一)元类
2022-08-05 02:41:00 【覆水难收呀】
一、什么是元类
python中所有的类的类型都是type,type就是元类:创建类的类叫做元类。
"""
python中所有的类的类型都是type
type就是元类:创建类的类叫做元类
"""
a = '11'
li = [11, 22]
class MyTest:
pass
m = MyTest()
print(type(a))
print(type(li))
print(type(m))
print(type(MyTest))
print(type(type))
print(type(dict))
print(type(str))
print(type(TypeError))
# 打印结果
<class 'str'>
<class 'list'>
<class '__main__.MyTest'>
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
<class 'type'>
二、type动态的创建类
type动态的创建类:
- 参数1 name:类名 (字符串类型)
- 参数2 bases:继承的父类(元组类型)
- 参数3 dict:类的属性和方法(字典类型)
class MyTest:
pass
# 通过type定义的类
MyTest2 = type('MyTest2', (object,), {"name": 110})
print(MyTest)
print(MyTest2)
print(MyTest2.name)
# 打印结果
<class '__main__.MyTest'>
<class '__main__.MyTest2'>
110
三、实战练习(附答案)
# 1、自定义一个元类,可以在创建类的时候,自动给类添加(class_name,create_time)
# 这两个类属性,属性值自己随便写一个
# 方法一:
class MyMateClass(type):
def __new__(cls, name, bases, attrs, *args, **kwargs):
a = super().__new__(cls, name, bases, attrs)
setattr(a, 'class_name', 123)
setattr(a, 'create_time', '20220804')
return a
# 方法二:
class MyMetaClass(type):
def __new__(cls, name, bases, attr_dict, *args, **kwargs):
attr_dict["class_name"] = name
attr_dict["create_time"] = time.strftime("%Y-%m-%d:%H:%M:%S")
return super().__new__(cls, name, bases, attr_dict)
if __name__ == '__main__':
ac = MyMateClass('ac', (object,), {})
print(ac.create_time)
# 2、通过元类生成用例的案例代码
import unittest
def update_test_func(func, value):
@wraps(func)
def wrapper(self, **kwargs):
return func(self, value)
return wrapper
class MyMateClass(type):
def __new__(cls, name, bases, attrs, *args, **kwargs):
# 通过元类创建一个类
test_cls = super().__new__(cls, name, bases, attrs)
# 遍历属性Cases
for index, value in enumerate(attrs['Cases']):
# func =test_cls.test_perform
func = getattr(test_cls, 'perform')
test_func = update_test_func(func, value)
# 动态给test_cls这个类 添加方法
setattr(test_cls, 'test_{}'.format(index), test_func)
return test_cls
class BaseApiCase:
"""用例执行的基本类"""
def perform(self, case):
"""用例执行的方法"""
print("测试数据:", case)
# 1、用例数据的处理
# 2、接口请求
# 3、响应数据提取
# 4、断言
边栏推荐
- Optimizing the feed flow encountered obstacles, who helped Baidu break the "memory wall"?
- 【解密】OpenSea免费创造的NFT都没上链竟能出现在我的钱包里?
- 多线程(2)
- 转:查尔斯·汉迪:你是谁,比你做什么更重要
- [Fortune-telling-60]: "The Soldier, the Tricky Way"-2-Interpretation of Sun Tzu's Art of War
- 行业案例|世界 500 强险企如何建设指标驱动的经营分析系统
- 基于左序遍历的数据存储实践
- 【genius_platform软件平台开发】第七十六讲:vs预处理器定义的牛逼写法!!!!(其他组牛逼conding人员告知这么配置来取消宏定义)
- mysql树状结构查询问题
- Access Characteristics of Constructor under Inheritance Relationship
猜你喜欢
Data storage practice based on left-order traversal
What should I do if the self-incrementing id of online MySQL is exhausted?
线上MySQL的自增id用尽怎么办?
Apache DolphinScheduler新一代分布式工作流任务调度平台实战-中
多线程(2)
继承关系下构造方法的访问特点
LeetCode使用最小花费爬楼梯----dp问题
C language implements a simple number guessing game
甘特图来啦,项目管理神器,模板直接用
SuperMap iDesktop.Net之布尔运算求交——修复含拓扑错误复杂模型
随机推荐
01 【前言 基础使用 核心概念】
行业案例|世界 500 强险企如何建设指标驱动的经营分析系统
多线程(2)
使用SuperMap iDesktopX数据迁移工具迁移ArcGIS数据
Ant Sword Advanced Module Development
Pisanix v0.2.0 发布|新增动态读写分离支持
后期学习计划
1527. 患某种疾病的患者
学习笔记-----左偏树
How OpenGL works
Multithreading (2)
汉字转拼音
Opening - Open a new .NET modern application development experience
02 【开发服务器 资源模块】
1873. 计算特殊奖金
[C language] Detailed explanation of stacks and queues (define, destroy, and data operations)
Chinese characters to Pinyin
力扣-二叉树的最大的深度
Apache DolphinScheduler, a new generation of distributed workflow task scheduling platform in practice - Medium
leetcode 15