09-16-周二_10-03-01
This commit is contained in:
@@ -167,6 +167,71 @@ while 1:
|
|||||||
print('输入错误。。。。')
|
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 方法
|
## 函数 vs 方法
|
||||||
|
|
||||||
### 通过打印函数(方法)名确定
|
### 通过打印函数(方法)名确定
|
||||||
|
Reference in New Issue
Block a user