我正在尝试设计一个界面,用于在运行类中的某些功能之前测试用户是否已登录。而不是:
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...]
这当然不起作用,但有没有办法使用装饰器来做到这一点?
答案 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)