如何在python应用程序中外部化decorator

2024-03-28 17:36:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经编写了一个python Flask应用程序,它有如下一个类和方法。你知道吗

class PythonSample:
    def method1():
        pass # does something

    def method2():
        pass # does something

现在我已经编写了另一个类,它有如下的decorator函数。你知道吗

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

在每种方法上使用decorator效果都很好。你知道吗

问题:不是将oauthAuth decorator应用于每个方法。有没有一种方法可以在python中进行配置,比如将oauthAuth decorator应用于类中的所有方法并排除某些方法。你知道吗

像include auth for specific url和exclude authentication for specific url之类的东西

请忽略此处python代码的语法。你知道吗


Tags: 方法urlfordefdecoratorpasssomethingclass
1条回答
网友
1楼 · 发布于 2024-03-28 17:36:03

你可以使用一个类装饰加上一些魔术。你知道吗

装饰功能

假设您有一个decorator,它在调用函数之前只记录一个字符串。你知道吗

def log(func):
    def logged_func(*args, **kwargs):
            print('logged')
            func(*args, **kwargs)
    return logged_func

装饰类

你也可以用同样的技巧,但是要用一个类。log_all是类装饰器,cls是类类型。我们使用vars遍历类字典,并使用callable(v)查找方法。用log(v)修饰方法,并使用setattrcls定义更改为新的修饰方法。就像函数装饰器一样,最终返回类。你知道吗

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

相关问题 更多 >