倚天杖
我经常使用类,而不是函数,作为我的装饰师。我在这方面遇到了一些问题,因为一个对象不会拥有函数所期望的所有相同的属性。例如,对象将不具有属性__name__..我对此有一个特定的问题,很难跟踪Django报告的错误“Object无属性”__name__“。不幸的是,对于类风格的装饰师,我不认为@PARY能够胜任这项工作。相反,我创建了一个基本的装饰类,如下所示:class DecBase(object):
func = None
def __init__(self, func):
self.__func = func def __getattribute__(self, name):
if name == "func":
return super(DecBase, self).__getattribute__(name)
return self.func.__getattribute__(name)
def __setattr__(self, name, value):
if name == "func":
return super(DecBase, self).__setattr__(name, value)
return self.func.__setattr__(name, value)这个类代理所有属性调用正在被修饰的函数。因此,您现在可以创建一个简单的装饰器,检查是否指定了2个参数,如下所示:class process_login(DecBase):
def __call__(self, *args):
if len(args) != 2:
raise Exception("You can only specify two arguments")
return self.func(*args)