【发布时间】:2017-11-07 06:03:17
【问题描述】:
我尝试编写这样的装饰器(内存不足,请原谅代码中的任何问题):
def required(fn):
def wrapped(self):
self.required_attributes += [fn.__name__]
fn(self)
return wrapped
我用它来装饰类中的@property 属性,例如:
@property
@required
def some_property(self):
return self._some_property
...这样我就可以做这样的事情:
def validate_required_attributes(instance):
for attribute in instance.required_attributes:
if not hasattr(instance, attribute):
raise ValueError(f"Required attribute {attribute} was not set!")
现在我忘记了这不起作用,因为要使用属性名称更新 required_attributes,我必须先检索该属性。所以本质上,当我在课堂上做 init 时,我可以只做一个 self.propertyname 来添加它......但是这个解决方案一点都不好,我还不如创建一个列表init 中的必需属性名称。
据我所知,装饰器是在编译时应用的,所以我无法在定义包装函数之前修改 required_attributes。还有其他方法可以使这项工作吗?我只想要一个漂亮、优雅的解决方案。
谢谢!
【问题讨论】:
-
def __init__(self, required_one, required_two)有什么问题?
标签: python python-3.6 python-decorators