Python中是否存在与Proxy和Reflect类似的技术实现?
Python 中对应 JavaScript Proxy 和 Reflect 的替代方案
一、替代 JavaScript Proxy(对象操作拦截)
Python 没有原生提供像 JS Proxy 那样开箱即用的全局代理对象,但可以通过重写类的特殊方法实现对属性/方法操作的拦截,核心方法包括:
__getattr__:拦截不存在的属性获取(已存在的属性不会触发)__getattribute__:拦截所有属性/方法的获取(需谨慎使用,避免递归调用)__setattr__:拦截属性赋值操作__delattr__:拦截属性删除操作__getitem__/__setitem__:拦截字典/序列的索引操作
示例:自定义属性拦截代理
class ObjectProxy: def __init__(self, target): # 用__dict__直接设置,避免触发__setattr__递归 self.__dict__["_target"] = target def __getattr__(self, name): print(f"[拦截] 获取属性: {name}") return getattr(self._target, name) def __setattr__(self, name, value): print(f"[拦截] 设置属性: {name} = {value}") setattr(self._target, name, value) def __delattr__(self, name): print(f"[拦截] 删除属性: {name}") delattr(self._target, name) # 使用示例 target_obj = {"username": "john_doe", "age": 28} proxy = ObjectProxy(target_obj) print(proxy.username) # 输出拦截日志 + john_doe proxy.age = 29 # 输出拦截日志 del proxy.age # 输出拦截日志
如果需要更灵活的代理(如拦截函数调用、类实例化),可以使用第三方库 wrapt,它提供了更简洁的代理封装,支持对函数、类、对象的全方位拦截。
二、替代 JavaScript Reflect(反射操作)
Python 的反射能力由内置函数和 inspect 模块共同提供,完全覆盖 JS Reflect 的核心功能:
核心反射操作示例
import inspect class User: def __init__(self, name): self.name = name def say_hello(self): return f"Hello, {self.name}!" user = User("Alice") # 1. 获取/设置/删除属性 print(getattr(user, "name")) # 等价于 Reflect.get() setattr(user, "name", "Bob") # 等价于 Reflect.set() delattr(user, "name") # 等价于 Reflect.deleteProperty() # 2. 检查属性是否存在 print(hasattr(user, "say_hello")) # 等价于 Reflect.has() # 3. 反射调用方法 hello_method = getattr(user, "say_hello") print(hello_method()) # 等价于 Reflect.apply() # 4. 获取对象的属性列表 print(dir(user)) # 等价于 Reflect.ownKeys() # 5. 解析方法签名 method_sig = inspect.signature(hello_method) print(method_sig) # 输出 ()
inspect 模块还支持获取类的继承关系、函数参数信息、源码等高级反射功能,比 JS Reflect 更强大。
内容的提问来源于stack exchange,提问作者maltsevdm
相关产品推荐
相关产品推荐

