【发布时间】:2012-04-21 11:24:04
【问题描述】:
我想将相同的装饰器应用于给定类中的每个方法,除了那些以__ 开头和结尾的方法。
在我看来,使用类装饰器应该是可行的。有什么需要注意的陷阱吗?
理想情况下,我还希望能够:
- 通过使用特殊装饰器标记某些方法来禁用此机制
- 也为子类启用此机制
- 即使对于在运行时添加到此类的方法也启用此机制
[注意:我使用的是 Python 3.2,所以如果这依赖于最近添加的功能,我很好。]
这是我的尝试:
_methods_to_skip = {}
def apply(decorator):
def apply_decorator(cls):
for method_name, method in get_all_instance_methods(cls):
if (cls, method) in _methods_to_skip:
continue
if method_name[:2] == `__` and method_name[-2:] == `__`:
continue
cls.method_name = decorator(method)
return apply_decorator
def dont_decorate(method):
_methods_to_skip.add((get_class_from_method(method), method))
return method
以下是我遇到的问题:
- 如何实现
get_all_instance_methods函数 - 不确定我的
cls.method_name = decorator(method)行是否正确 - 如何对在运行时添加到类的任何方法执行相同操作
- 如何将其应用于子类
- 如何实现
get_class_from_method
【问题讨论】:
-
您似乎对如何做到这一点有一个可靠的想法,您是否要求人们为您实施它?如果没有,那么如果您有实际问题,为什么不尝试后发布呢?
-
@Lattyware 感谢您指出这一点;我更新了问题以显示我的问题。
-
@anonymous downvoter:请保持礼貌并在投票时评论您不喜欢的内容。我的问题是不是太糟糕了,以至于我什至不值得解释它有什么问题?
-
呃,不想这么说,但反对票来自我,我给出了我的理由。现在你已经给出了你的实现,问题更具体了,我会删除它。
-
对不起对不起。完全同意您的反对意见。希望更新后的问题没问题。
标签: python class python-3.x decorator