【发布时间】:2020-08-20 16:48:05
【问题描述】:
我正在编写多个类,并将一个公共逻辑添加到一堆属性中。这是代码的简化版本:
class FooAspect:
_bar_prop = 'bar'
def __init__(self, bar_value: int):
self._bar = bar_value
@property
def bar(self) -> int:
return self._bar
@bar.setter
def bar(self, value: int) -> None:
self._bar = value
perfrom_action(self._bar_prop, value)
perform_action 总是有类似的形式,我想用装饰器封装它。本质上我正在寻找一种方法来写这样的东西:
# ... define @my_setter
class FooAspect:
# ...
@property
def bar(self) -> int:
return self._bar
@bar.my_setter(key='bar')
def bar(self, value: int) -> None:
self._bar = value
是否可以扩展@property 或@prop.setter 来实现这一点?
【问题讨论】:
-
您可能应该只编写自己的描述符,而不是尝试扩展
property整点或property是为您提供一个非常常见的用例的实现,用于更复杂的事情, 你应该只写你自己的描述符. -
@juanpa.arrivillaga 谢谢你的建议,我没想到!我仍然想扩展
property(或实现我自己的版本,但我不确定它是通过哪种机制工作的,它与我之前使用的简单装饰器不同)因为它允许保留所有与属性在代码中靠得很近。 -
这就是我所说的“实现你自己的描述符”的意思。它是一个 decorator 的事实并不真正相关。这不是它的基本工作方式,它之所以有效,是因为装饰器返回了一个描述符对象。
-
谢谢@juanpa.arrivillaga!这正是我所需要的。我设法实现了我需要的行为并在下面发布了答案。
-
@juanpa.arrivillaga OP 要求的是在
property类已经完成的功能之上执行额外的功能,这正是类继承的目的。我已经包含了这样一个实现供参考。
标签: python decorator python-decorators