Python - 装饰类方法以测试类属性

时间:2012-03-08 15:32:48

标签: python decorator

我正在尝试设计一个界面,用于在运行类中的某些功能之前测试用户是否已登录。而不是:

class UserDoesStuff(object):
    def doIfLoggedIn(self):
        if self.checkLogin():
           [...do the stuff...]

我想知道我是否可以拥有这样的东西:

def protected(self):
     if not self.checkLogin():
         raise UserLoginError()

@protected
def doIfLoggedIn(self):
    [...do the stuff...]

这当然不起作用,但有没有办法使用装饰器来做到这一点?

2 个答案:

答案 0 :(得分:5)

装饰器(最简单的,没有额外的args)期望函数作为输入:

import functools

def protected(fun):
    @functools.wraps(fun)
    def wrapper(self, *args, **kwargs):
        if not self.checkLogin():
            raise UserLoginError()
        return fun(self, *args, **kwargs)

    return wrapper # this is what replaces the original method

@protected
def doIfLoggedIn(self):
    ...

答案 1 :(得分:0)

是的,您可以查看Django docs on @login_requiredhow they do it