Python高级应用系列(十二):元编程实战——动态创建类与代码生成
标签:Python | 元编程 | 动态代码 | eval | exec | type | 代码生成字数:约 4000 字建议阅读时间:12 分钟前言元编程(Metaprogramming)是指"程序能够操纵自身或生成其他程序"的编程范式。Python 中元编程无处不在——装饰器是元编程、类装饰器是元编程、@dataclass也是元编程。掌握元编程,意味着你能在运行时改变程序的行为,写出高度通用和可扩展的代码。本文从"代码即数据"的视角出发,系统讲解 Python 元编程的三大核心武器:type、exec/eval、以及ast模块。一、type 的双面孔:查类型与造类1.1 用 type() 动态创建类# type(name, bases, namespace) ——三参数版 MyClass = type("MyClass", (object,), { "value": 42, "get_value": lambda self: self.value }) # 等价于: # class MyClass: # value = 42 # def get_value(self): # return self.value obj = MyClass() print(obj.value) # 42 print(obj.get_value()) # 421.2 动态创建带方法的类def greet(self): return f"Hello, I'm {self.name}" def __init__(self, name): self.name = name # 在 namespace 中传入函数 Person = type("Person", (object,), { "__init__": __init__, "greet": greet, "species": "human" }) p = Person("张三") print(p.greet()) # Hello, I'm 张三1.3 动态创建继承层次def make_model_class(model_name: str, fields: dict): """根据字段定义动态生成数据类""" namespace = {"_fields": fields} def __init__(self, **kwargs): for key, field_type in fields.items(): if key not in kwargs: raise TypeError(f"缺少必填字段: {key}") setattr(self, key, kwargs[key]) def __repr__(self): values = ", ".join(f"{k}={getattr(self, k)!r}" for k in fields) return f"{model_name}({values})" namespace["__init__"] = __init__ namespace["__repr__"] = __repr__ return type(model_name, (object,), namespace) # 使用:动态创建 User 模型 User = make_model_class("User", {"name": str, "age": int, "email": str}) user = User(name="Alice", age=30, email="alice@example.com") print(user) # User(name='Alice', age=30, email='alice@example.com')二、exec 与 eval:执行动态代码2.1 eval:求值表达式# eval 只能执行表达式,返回结果 result = eval("3 + 4 * 2") print(result) # 11 # 带变量上下文 x = 10 result = eval("x * x", {"x": x}) # 安全:不暴露其他全局变量 print(result) # 100 # 支持内置函数 result = eval("abs(-42)", {"__builtins__": __builtins__}) print(result) # 422.2 exec:执行代码语句# exec 执行
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2544619.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!