【发布时间】:2021-07-27 12:33:09
【问题描述】:
在下面的代码中,我使用元类和装饰器来装饰所有用户定义的方法。
它适用于所有实例方法,但在静态方法的情况下,由于 self 参数而失败,以避免我使用 try 和 except 块,从而解决了问题。但在我的一个项目中,它没有成功。
有没有更好的方法通过包含在元类中的函数装饰器来装饰静态方法的输出?
from functools import wraps
import types
def decorator_function(input_function):
@wraps(input_function)
def wrapper(self, *args, **kwargs):
if kwargs.get("test_parameter"):
kwargs["test_parameter"] = 999
try:
result = input_function(self, *args, **kwargs)
except:
result = input_function(*args, **kwargs)
return result
return wrapper
class DecoratorMetaClass(type):
def __new__(meta, name, bases, class_dict):
klass = super().__new__(meta, name, bases, class_dict)
for key in dir(klass):
value = getattr(klass, key)
if isinstance(value, types.FunctionType) and "__" not in key:
wrapped = decorator_function(value)
setattr(klass, key, wrapped)
return klass
class InterfaceClass(metaclass=DecoratorMetaClass):
def function(self, test_parameter=1):
print(f"function - Test Parameter= {test_parameter}")
@staticmethod
def static_function(test_parameter=1):
print(f"static_function - Test Parameter= {test_parameter}")
class UserClass(InterfaceClass, metaclass=DecoratorMetaClass):
def __init__(self):
pass
def function_2(self, test_parameter=1):
print(f"function_2 - Test Parameter= {test_parameter}")
instance = UserClass()
instance.function(test_parameter=2)
instance.function_2(test_parameter=2)
instance.static_function(test_parameter=2)
print(isinstance(instance, InterfaceClass))
PS:我没有使用类装饰器,因为它会导致 isinstance 检查失败。
【问题讨论】:
-
您可以将函数
wrapper的签名从wrapper(self, *args, **kwargs)更改为wrapper(*args, **kwargs)。然后分配result = input_function(*args, **kwargs)。你不需要这个装饰器的 try/except 块。
标签: python-3.x