在 class 中应用装饰器所有函数而不使用 Metaclass
Apply decorator all function in a class without using Metaclass
我一直在使用以下 (Jython 2.7) 代码来修饰某些 classes 中的函数:
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
修饰所有 public 函数(即名称不以下划线开头的函数)。当然,这种行为只在继承自 Useless
.
的 classes 中出现
不幸的是,我 运行 遇到元 class 冲突错误。我很难调试它们,我认为它们的发生是出于我无法控制的原因(由于我使用的第三方库:Sikuli)。
但是,也许我根本不需要使用元class!有谁知道不使用 metaclass 来模拟我上面的代码的方法吗?
即,是否有任何其他方法可以将装饰器应用于 class 中的所有函数?
(P.S。我知道我可以手动装饰每个函数,但这不是我正在寻找的解决方案)
将您的元class 转换为class 装饰器应该很简单。 class 装饰器简单地接收 class 作为参数和 returns (修改后的)class:
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__
,至于新的样式classes 将是一个不支持赋值的dictproxy,所以你必须使用setattr
改为 class。然后你只需创建你的 class:
@useless_class_decorator
class Useless(object):
def method_to_decorate(self, *args, *kwargs):
...
但是这不会影响 Useless
的子classes,它们也必须使用 class 装饰器进行装饰。如果这不能接受,那么 metaclass 可能是更好的选择...
我一直在使用以下 (Jython 2.7) 代码来修饰某些 classes 中的函数:
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
修饰所有 public 函数(即名称不以下划线开头的函数)。当然,这种行为只在继承自 Useless
.
不幸的是,我 运行 遇到元 class 冲突错误。我很难调试它们,我认为它们的发生是出于我无法控制的原因(由于我使用的第三方库:Sikuli)。
但是,也许我根本不需要使用元class!有谁知道不使用 metaclass 来模拟我上面的代码的方法吗?
即,是否有任何其他方法可以将装饰器应用于 class 中的所有函数?
(P.S。我知道我可以手动装饰每个函数,但这不是我正在寻找的解决方案)
将您的元class 转换为class 装饰器应该很简单。 class 装饰器简单地接收 class 作为参数和 returns (修改后的)class:
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__
,至于新的样式classes 将是一个不支持赋值的dictproxy,所以你必须使用setattr
改为 class。然后你只需创建你的 class:
@useless_class_decorator
class Useless(object):
def method_to_decorate(self, *args, *kwargs):
...
但是这不会影响 Useless
的子classes,它们也必须使用 class 装饰器进行装饰。如果这不能接受,那么 metaclass 可能是更好的选择...