09-16-周二_10-03-01

This commit is contained in:
2025-09-16 10:03:01 +08:00
parent 36ca88991e
commit 355a5a52f3

View File

@@ -167,6 +167,71 @@ while 1:
print('输入错误。。。。')
```
## 元编程特性
**元编程Metaprogramming**是Python中一种高级编程范式其核心思想是**编写能够操作代码本身的程序**——通过在运行时动态生成、修改或执行代码实现对程序行为的灵活控制。这种特性让Python具备极强的动态性与抽象能力成为框架开发、代码生成等场景的基石。
### **1. 装饰器**
**函数/类的行为扩展工具**
装饰器是Python最常用的元编程技术之一本质是**接收函数或类作为输入、返回修改后函数/类的高阶函数**。通过`@decorator`语法糖,可在不修改原代码的情况下,为函数/类添加日志、性能监控、权限验证等功能。
- **基础装饰器**:例如日志装饰器`@log_decorator`,可在函数调用前后打印日志;
- **带参数的装饰器**:通过外层函数接收参数,实现更灵活的功能控制(如`@repeat(times=3)`让函数执行3次
- **类装饰器**用于修改类的行为例如实现单例模式确保类只有一个实例、自动注册类到全局字典如Django模型注册
### **2. 元类**
**类的创建控制器**
元类是**创建类的类**(默认元类为`type`),通过继承`type`并重写`__new__``__init__`方法,可控制类的创建过程,实现动态修改类属性、添加方法、强制类遵循接口规范等功能。
- **动态添加属性/方法**:例如在类创建时自动添加`author`属性或`hello`方法;
- **强制接口检查**:通过元类确保类实现了特定方法(如`run`方法),避免类定义不完整;
- **动态注册类**例如ORM框架中通过元类自动将模型类注册到全局注册表方便后续生成SQL语句。
### **3. 动态属性与描述符**
**属性访问的控制者**
动态属性允许在运行时修改对象的属性,而描述符则通过定义`__get__``__set__`等方法,精确控制属性的访问行为。
- **动态属性**:通过`__getattr__`(获取不存在的属性)、`__setattr__`(设置属性)等方法,实现动态属性访问(如代理类通过`__getattr__`转发属性访问);
- **描述符**:用于实现数据验证、只读属性等功能。例如`ReadOnlyDescriptor`可防止属性被修改,`ValidatedDescriptor`可验证属性值的合法性(如确保年龄为正数)。
### **4. 反射**
**程序的自省能力**
反射是程序**在运行时检查、修改自身结构**的能力,通过内置函数(`getattr``hasattr``setattr``delattr`)和`inspect`模块,可动态获取对象的属性、方法信息,或修改对象行为。
- **获取信息**`hasattr(obj, 'name')`检查对象是否有`name`属性,`getattr(obj, 'name')`获取`name`属性的值;
- **修改属性**`setattr(obj, 'age', 30)`设置对象的`age`属性为30`delattr(obj, 'age')`删除`age`属性;
- **动态调用方法**`getattr(obj, 'method')()`获取并调用对象的`method`方法。
### **5. 动态代码生成与执行**
**运行时代码的灵活构建**
通过`exec``compile``eval`等函数,可在运行时生成并执行代码字符串,实现动态代码生成。
- **动态创建函数**:例如`exec`生成`add`函数(`def add(a, b): return a + b`),并通过`eval`获取函数对象;
- **动态修改方法**猴子补丁Monkey Patching通过动态修改现有类的方法扩展其功能如为`Logger`类动态添加`log_warning`方法);
- **动态生成类**:通过`type`函数动态创建类(如`type('DynamicClass', (), {'attr': 42})`创建包含`attr`属性的类)。
### **6. AST操作**
**代码结构的深度修改**
`ast`抽象语法树模块允许解析、修改Python代码的语法结构实现更高级的代码生成与修改。
- **解析代码**将代码字符串解析为AST`ast.parse("a = 1 + 2")`
- **修改AST**遍历AST节点修改代码结构如将`a = 1 + 2`修改为`a = 1 * 2`
- **生成代码**将修改后的AST编译为可执行代码`compile`函数)。
元编程的灵活性使其成为Python框架如Django、Flask、SQLAlchemy的核心技术但也需注意**代码可读性**(过度使用元编程会增加代码复杂度)、**调试难度**(动态生成的代码难以跟踪)、**安全性**(动态执行代码可能引发安全漏洞)等问题。合理使用元编程,能让代码更简洁、灵活,提升开发效率。
## 函数 vs 方法
### 通过打印函数(方法)名确定