我有一个类方法,需要在执行" real"之前先进行一些基本的验证。操作
一个明显的实施选择是:
def _validator(self, args):
do-validation
def method_real(self, args):
self._validator(args)
do-real-thing
另一个是:
def validator(fn):
def _validate(*args, **kwargs):
do-validation
return fn(*args, **kwargs)
return _validate
@validator
def method_real(self, args):
do-real-thing
虽然这里使用了装饰器并且提供了更好的代码可读性和组织,但我想看看是否只为一种方法使用装饰器。这个装饰器不能被类中的其他方法使用,因为它只对该方法进行非常具体的验证。
思想?
答案 0 :(得分:1)
在我看来,你不需要一个装饰者,这总是一个很好的迹象,表明你并不想要一个。这只是你的基本KISS原则,但除此之外还有更多。对于装饰者来说,你可能没有意识到那里的细微差别,最终会造成弊大于利。至少可以说调试有问题。 Graham Dumpleton has an incredibly informative series of posts了解使用装饰器时可以了解的内容(警告:非常深入)。
如果我是你,我只是简单地描述逻辑,如果它很简单,或者创建一个单独的方法/功能,如果不是。如果您真的只是想让使用此行为的模块变得更清洁",那么使用此验证逻辑创建一个新模块并导入。
另一方面,如果你知道你需要一个装饰者,那么你可能想要一个。