Python中能否用变量实现@property装饰类方法的相同行为?
可以实现,以下是两种可行方案
方案一:代理对象(模拟属性访问行为)
通过定义一个代理类,让它的实例在被格式化输出时自动触发原属性的getter逻辑,实现无点语法调用:
class ExponentialDecay: def __init__(self): self._alpha = 1 @property def alpha(self): self._alpha *= .98 return self._alpha d = ExponentialDecay() # 代理类:每次被repr时触发alpha属性的获取 class AlphaProxy: def __init__(self, target_obj): self.target = target_obj def __repr__(self): return repr(self.target.alpha) foo = AlphaProxy(d) # 输出与原代码完全一致 for i in range(5): print(f"d.alpha={foo}")
如果希望输出格式为foo=xxx(数值序列与原代码一致),只需把print语句改为print(f"{foo=}")即可。
方案二:lambda函数(可调用式实现)
用lambda绑定原属性的获取逻辑,通过调用函数来获取值,避免在print语句中使用点语法:
class ExponentialDecay: def __init__(self): self._alpha = 1 @property def alpha(self): self._alpha *= .98 return self._alpha d = ExponentialDecay() # 用lambda封装alpha属性的获取 foo = lambda: d.alpha for i in range(5): print(f"d.alpha={foo()}")
重要提醒:正如你补充的,这两种方案都属于技巧性的hack写法,严重损害代码可读性和可维护性,绝对不要在实际项目中使用。
内容的提问来源于stack exchange,提问作者QuantumPotatoe
相关产品推荐
相关产品推荐

