8个例子探秘 Python 元类与定制类

图片

大家好,今天我们要一起探索 Python 世界里的神秘角色——元类(Metaclasses),它们就像魔法一样,能让我们的类变得超乎寻常。想象一下,如果你的类能自己决定自己的行为,那是不是超级酷炫?别急,接下来我们就通过8个小实验来感受元类的魅力!

1. 自定义类名生成器

def custom_name(cls):return f"MyCustom{cls.__name__}"
class MetaMyClass(type):def __new__(cls, name, bases, attrs):attrs['__name__'] = custom_name(name)return super().__new__(cls, name, bases, attrs)class MyClass(metaclass=MetaMyClass):passprint(MyClass)  # 输出: MyCustomMyClass

这就是元类帮我们自定义类名的小把戏。

2. 类属性注入

class MetaInject(type):def __init__(cls, name, bases, attrs):attrs['shared_var'] = 'Injected by MetaClass'super().__init__(name, bases, attrs)class MyClass(metaclass=MetaInject):passprint(MyClass.shared_var)  # 输出: Injected by MetaClass

元类让我们能在创建类时自动添加属性。

3. 检查类继承

def check_inheritance(metacls, bases):if 'BaseClass' not in bases:raise ValueError('BaseClass not found!')
metacls = type('MetaCheck', (MetaCheck,), {'__init_subclass__': check_inheritance})class MyClass(metaclass=MetaCheck):passtry:class NotDerivedClass():pass
except ValueError as e:print(e)  # 输出: BaseClass not found!

确保子类继承了特定基类,元类在关键时刻把关。

4. 预设方法实现

class MetaOverride(type):def __call__(cls, *args, **kwargs):instance = super().__call__(*args, **kwargs)instance.custom_method()return instanceclass MyClass(metaclass=MetaOverride):def custom_method(self):print("Custom method called!")my_instance = MyClass()

元类改变类的实例化行为,自动调用预设方法。

5. 实例化前检查

class MetaPreInit(type):def __init__(cls, *args, **kwargs):if not isinstance(args[0], str):raise TypeError('Argument must be a string!')super().__init__(*args, **kwargs)class MyClass(metaclass=MetaPreInit):passtry:MyClass(123)
except TypeError as e:print(e)  # 输出: Argument must be a string!

元类在实例化前检查输入类型,严格控制创建条件。

6. 类属性动态修改

class MetaDynamic(type):def __setattr__(cls, key, value):super().__setattr__(key, value.upper())print(f"Attribute {key} set to {value} (uppercase).")class MyClass(metaclass=MetaDynamic):my_attribute = "hello"my_class = MyClass()
print(my_class.my_attribute)  # 输出: ATTRIBUTE HELLO (UPPERCASE).

元类改变类属性值的处理方式,实时转换。

7. 类行为修改

class MetaBehavior(type):def __getattribute__(cls, name):if name == 'some_method':return lambda: 'Overridden!'return super().__getattribute__(name)class MyClass(metaclass=MetaBehavior):some_method = "Original method"print(MyClass.some_method())  # 输出: Overridden!

元类拦截并修改类的行为,动态改变方法。

8. 类的工厂模式

def create_class(name, base_class):class MetaFactory(type):def __new__(cls, name, bases, attrs):return type(name, (base_class,), attrs)return type(name, (base_class,), {})MyCustomClass = create_class('MyCustomClass', MyClass)

元类作为工厂,动态创建具有特定行为的子类。

以上就是8个有趣的元类使用场景,它们让Python类变得更智能,定制化。记住,元类是高级工具,合理运用能让你的代码更加优雅和强大!现在,去试试这些小技巧,让Python编程变得更有趣吧!

往期精选:

20个超实用Python魔法方法

15个简单实用案例解密 Python 文件操作

20个高级有趣的 python 函数

文末福利/每周赠书

参与方式: 关注下方公众号回复抽奖参与抽奖

本期奖品:《ChatGPT 实操应用大全》一本

截止时间: 2024/4/7 12:00:00

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/587227.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.5网安学习第三阶段第五周回顾(个人学习记录使用)

本周重点 ①SSRF服务器端请求伪造 ②序列化和反序列化 ③Vaudit代码审计 本周主要内容 ①SSRF服务器端请求伪造 一、概述 SSRF: server site request forgery (服务器端请求伪造)。 SSR: 服务端请求,A服务器通过函数向B服务器发送请求。 SSRF发生的前提条件…

STM32-02基于HAL库(CubeMX+MDK+Proteus)GPIO输出案例(LED流水灯)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式,生成代码四、MDK打开生成项目,编写HAL库的GPIO输出代码五、运行仿真程序,调试代码 一、功能需求分析 在完成开发环境搭建之后,开始使用STM32GP…

谷歌google广告和必应Bing广告,是否二选一?

搜索引擎广告凭借其精准定向、高度可见性和高效转化能力,成为众多企业拓展海外市场、提升品牌影响力的重要手段。其中,谷歌Google与必应Bing作为全球两大主流搜索引擎,各自拥有庞大的用户群体与独特的市场优势。面对这两大广告平台&#xff0…

【Qt 学习笔记】Qt 背景介绍

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt 背景介绍 文章编号:Qt 学习笔记 / 01 文章目录 Qt 背景…

C++面向对象程序设计 - 构造函数

C提供了构造函数来处理对象的初始化,构造函数是一种特殊的成员函数,与其他成员函数不同,它不需要用户来调用,而是在建立对象时自动执行。构造函数名称必须与类同名,而不能由用户任意命名,以便编译系统能识别…

车载以太网AVB交换机 TSN交换机 时间敏感网络 11口 千兆 SW2000TSN

目录 一、TSN时间敏感交换机概述 二、产品介绍 SW2000M/H TSN 1、产品框架 2、产品特点与参数 产品特点 产品参数 3、配置与使用 4、常用连接方式 4.1 双通道作为监控和数据采集器,采集两个设备间的通信数据(Bypass功能) 4.2 试验搭…

曲线降采样之道格拉斯-普克算法Douglas–Peucker

曲线降采样之道格拉斯-普克算法Douglas–Peucker 该算法的目的是,给定一条由线段构成的曲线,找到一条点数较少的相似曲线,来近似描述原始的曲线,达到降低时间、空间复杂度和平滑曲线的目的。 附赠自动驾驶学习资料和量产经验&…

Linux安装Tomcat保姆级教程

文章目录 前言一、安装JDK二、Tomcat下载三、Tomcat安装1.创建Tomcat的安装目录2.切换到Tomcat的安装目录3.上传Tomcat安装包4.解压缩5.切换到安装好的tomcat的bin目录6.启动tomcat7.网络请求测试 四、外部电脑访问nginx设置方法一:关闭防火墙方法二:添加…

回顾快速排序

快速排序 快速排序的核心: 找到一个key 通常左边的数比key小,右边的数比key大。 找key通常有三种方法: 1. 挖坑法: 代码实现: // int _pivot(int* a, int left, int right) {int begin left, end right;int in…

数据结构(初阶)第二节:顺序表

从本文正式进入对数据结构的讲解,开始前友友们要有C语言的基础,熟练掌握动态内存管理、结构体、指针等章节,方便后续的学习。 顺序表(Sequence List) 线性表的概念:线性表(linear list&#xff…

ssm016基于 Java Web 的校园驿站管理系统+jsp

校园驿站管理系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对校园快递信息管理混乱,出…

stm32串口的使用

我们先简单介绍一下基本的概念 1数据的通信方式: 2 这里三种数据传输方向分类大家需要记住。后面的通信都会涉及到。 3 我们来看一下常见的通信,这里我们使用usart 一什么是串口 1.1概述 : 指按位发送和接收的接口 但是,rs233…