我觉得在处理常规函数时,我对使用decorator有很好的掌握,但是在派生类中为decorator使用基类的方法和将参数传递给decorator之间,我不知道接下来该怎么做。 下面是一段代码。你知道吗
class ValidatedObject: ... def apply_validation(self, field_name, code): def wrap(self, f): self._validations.append(Validation(field_name, code, f)) return f return wrap class test(ValidatedObject): .... @apply_validation("_name", "oh no!") def name_validation(self, name): return name == "jacob"
如果我按原样尝试,我会得到一个“应用\验证”未找到。
如果我用@self.apply_validation
试一下,就会发现“self”没有找到。
我也一直在把apply_validation
作为一个类方法,但没有成功。你知道吗
有人能解释一下我做错了什么,以及解决这个问题的最佳方法吗?非常感谢。你知道吗
问题是
apply_validation
是一个方法,这意味着您需要在ValidatedObject
的实例上调用它。不幸的是,在调用它时(在test
类的定义期间),没有合适的实例可用。你需要一个不同的方法。你知道吗最明显的一种方法是使用一个元类来搜索它的实例字典(实际上是类字典),并根据找到的内容设置
_validations
变量。您仍然可以使用decorator,但它可能应该是一个全局函数,或者可能是一个静态方法,并且需要以不同的方式工作。下面是一些使用元类和添加函数属性的装饰器的代码:此代码运行后,
test._validations
将是[Validation("_name", "oh no!", test.name_validation)]
。请注意,传递给Validation
的方法是未绑定的,因此您需要在调用它时自己传递一个self
参数(或者删除self
参数并将在apply_validation
中创建的装饰器更改为返回staticmethod(f)
)。你知道吗如果在继承层次结构的多个级别上定义了验证方法,则此代码可能无法实现所需的功能。上面所写的元类只检查立即类的dict中是否有具有适当属性的方法。如果需要在
_validations
中也包含继承的方法,则可能需要修改ValidatedMeta.__new__
中的逻辑。可能最简单的方法是在bases
中查找_validations
属性并将列表连接在一起。你知道吗仅举一个在类方法上使用装饰器的示例:
相关问题 更多 >
编程相关推荐