我写了一个python Flask应用程序,它具有如下的类和方法。
class PythonSample:
def method1():
pass # does something
def method2():
pass # does something
现在我写了另一个具有装饰器功能的类,如下。
class PythonAuth:
def oauthAuth():
pass
现在我为下面的PythonSample类的所有方法连接oauthAuth装饰器
import oauthAuth from PythonAuth
class PythonSample
@oauthAuth
def method1():
pass # does something
@oauthAuth
def method2():
pass # does something
在每种方法上应用装饰器都可以正常工作。
问题:而不是将oauthAuth装饰器应用于每个方法。有没有一种方法可以在python中进行配置,因为将oauthAuth装饰器应用于类中的所有方法并排除某些方法。
类似于某些URL包含身份验证,而某些URL不包含身份验证
请在这里忽略python代码的语法。
您可以使用类装饰器和一些魔术。
假设您有一个装饰器,该装饰器在调用该函数之前仅记录一个字符串。
def log(func):
def logged_func(*args, **kwargs):
print('logged')
func(*args, **kwargs)
return logged_func
您可以使用相同的技巧,但要使用一个类。 log_all
是类装饰器,cls
是类类型。我们使用vars
浏览类字典,并使用callable(v)
查找方法。用log(v)
装饰该方法,然后使用setattr
将cls
定义更改为新的修饰方法。就像函数装饰器一样,最后返回类。
def log_all(cls):
for k, v in vars(cls).items():
if callable(v):
setattr(cls, k, log(v))
return cls
我本质上忽略了k
,但是k
是方法名称,您可以利用它来实现您的使用场景。
这里是一个完整的例子,现在应该有意义。
def log(func):
def logged_func(*args, **kwargs):
print('logged')
func(*args, **kwargs)
return logged_func
def log_all(cls):
for k, v in vars(cls).items():
if callable(v):
setattr(cls, k, log(v))
return cls
@log_all
class A:
def method(self):
pass
A
类中的每个方法都应使用log
装饰器进行装饰。
>>> a = A()
>>> a.method()
logged