我一直在使用以下(Jython 2.7)代码来装饰某些类中的函数:
import sys
import inspect
from decorator import decorator
def useless_decorator(method, *args, **kwargs):
#Does nothing yet :D
return method(*args, **kwargs)
class UselessMetaClass(type):
def __new__(cls, clsname, bases, dict):
for name, method in dict.items():
if not name.startswith('_') and inspect.isroutine(method):
dict[name] = decorator(useless_decorator, method)
return type.__new__(cls, clsname, bases, dict)
class Useless(object):
__metaclass__ = UselessMetaClass
目标是使用useless_decorator
装饰所有公共功能(即名称不以下划线开头的功能)。当然,只有在继承自Useless
。
不幸的是,我遇到了元类冲突错误。我调试它们很困难,我认为它们是由于我无法控制的原因而发生的(由于我使用的第三方库:Sikuli)。
但是,也许我根本不需要使用元类!有没有人知道如何在不使用元类的情况下模拟上面的代码?
I.E。,还有其他方法可以将装饰器应用于类中的所有函数吗?
(P.S。我知道我可以手动装饰每个功能,但那不是我正在寻找的解决方案)
答案 0 :(得分:3)
将您的元类转换为类装饰器应该是直截了当的。类装饰器simly接收类作为参数并返回(修改过的)类:
def useless_class_decorator(cls):
for name, method in cls.__dict__.items():
if not name.startswith('_') and inspect.isroutine(method):
setattr(cls, name, decorator(useless_decorator, method))
return cls
这里的主要区别在于你不能在这里直接更改cls.__dict__
,因为新的样式类将是一个不支持赋值的dictproxy,所以你必须使用setattr
而是改为。然后你只需创建你的类:
@useless_class_decorator
class Useless(object):
def method_to_decorate(self, *args, *kwargs):
...
但是这不会影响Useless
的子类,那些也必须使用类装饰器进行修饰。如果这是不可接受的,那么元类可能是更好的选择......