python decorator nestification装饰器叠加

  

复制代码
def b(fn):
    print(111111111)
    def wrapper(*args,**kwargs):
        print(22222222222222)
        ret=fn(*args,**kwargs)
        return ret
    return wrapper

def p(fn):
    print('x'*60)
    def wrapper(*args,**kwargs):
        print('y'*60)
        return fn(*args,**kwargs)
    return wrapper

class B:

    @b
    @p
    def v(cls):
        print(cls)

c=B()
c.v()
复制代码

 

 

 最下面的装饰器先装饰,最上面的装饰器后装饰

但是执行的时候,最上面的装饰器由于是最后装饰,所以先执行最上面装饰器的额外功能

 

复制代码
from wsgiref.simple_server import make_server
from webob import Request, Response, exc
from webob.dec import wsgify


class Application:
    ROUTING = {}

    @classmethod
    def register(cls, path):
        def wrapper(fn):
            cls.ROUTING[path] = fn
            return fn

        return wrapper

    @classmethod
    @wsgify
    def __call__(cls, request: Request):try:
            return cls.ROUTING[request.path](request)
        except Exception:
            raise exc.HTTPNotFound('Not FoundD!!!!!!')


@Application.register('/')
def index(request: Request) -> Response:
    response = Response()
    response.status_code = 200
    response.content_type = 'text/html'
    response.charset = 'utf8'
    response.body = 'uiop'.encode()
    return response


@Application.register('/vbnm')
def vbnm(request: Request) -> Response:
    response = Response()
    response.status_code = 301
    response.content_type = 'text/plain'
    response.charset = 'gb2312'
    response.body = 'vbnm'.encode()
    return response


if __name__ == '__main__':
    server = make_server('', 9999, Application())
    try:
        server.serve_forever()
    except:
        pass
    finally:
        server.shutdown()
        server.server_close()
复制代码

 

 

  上面先使用@classmethod后使用@wsgify装饰,执行报错

 

 

 

改为上面,将其参数打印出来

复制代码
<class '__main__.Application'>




{'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\flirt flare\\AppData\\Roaming', 'CATALINA_HOME': 'C:\\Program Files\\apache-tomcat-9.0.36', 'CLASSPATH': '.,C:\\Program Files\\Java\\jdk-14.0.1\\lib', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'RECOMPENSE', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\flirt flare', 'IDEA_INITIAL_DIRECTORY': 'C:\\Users\\flirt flare\\Desktop', 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk-14.0.1', 'LOCALAPPDATA': 'C:\\Users\\flirt flare\\AppData\\Local', 'LOGONSERVER': '\\\\RECOMPENSE', 'NUMBER_OF_PROCESSORS': '4', 'ONEDRIVE': 'C:\\Users\\flirt flare\\OneDrive', 'OS': 'Windows_NT', 'PATH': 'C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;C:\\Program Files (x86)\\Common Files\\Thunder Network\\KanKan\\Codecs;C:\\Program Files\\Java\\jdk-14.0.1\\bin;C:\\Program Files\\apache-maven-3.6.3\\bin;C:\\Program Files\\apache-tomcat-9.0.36\\bin;C:\\Program Files\\Windows Imaging\\;C:\\Program Files (x86)\\Windows Kits\\8.1\\Windows Performance Toolkit\\;C:\\Program Files\\apache-tomcat-9.0.36\\bin;C:\\Program Files\\Git\\cmd;C:\\Program Files\\OpenSSH;C:\\Program Files\\IDM Computer Solutions\\UltraEdit;C:\\Program Files\\MySQL\\MySQL Server 8.0\\bin;C:\\Program Files\\MySQL\\MySQL Shell 8.0\\bin\\;C:\\Users\\flirt flare\\AppData\\Local\\Programs\\Python\\Python38\\Scripts\\;C:\\Users\\flirt flare\\AppData\\Local\\Programs\\Python\\Python38\\;C:\\Users\\flirt flare\\AppData\\Local\\Programs\\Python\\Launcher\\;C:\\Users\\flirt flare\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Program Files (x86)\\Nmap;d:\\Program Files\\JetBrains\\PyCharm Community Edition 2019.3.3\\bin;', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 94 Stepping 3, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '5e03', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM COMMUNITY EDITION': 'd:\\Program Files\\JetBrains\\PyCharm Community Edition 2019.3.3\\bin;', 'PYCHARM_HOSTED': '1', 'PYTHONIOENCODING': 'UTF-8', 'PYTHONPATH': 'C:\\Users\\flirt flare\\PycharmProjects\\notary', 'PYTHONUNBUFFERED': '1', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\Windows', 'TEMP': 'C:\\Users\\FLIRTF~1\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\FLIRTF~1\\AppData\\Local\\Temp', 'USERDOMAIN': 'RECOMPENSE', 'USERDOMAIN_ROAMINGPROFILE': 'RECOMPENSE', 'USERNAME': 'flirt flare', 'USERPROFILE': 'C:\\Users\\flirt flare', 'VS140COMNTOOLS': 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\Common7\\Tools\\', 'WINDIR': 'C:\\Windows', 'SERVER_NAME': 'recompense', 'GATEWAY_INTERFACE': 'CGI/1.1', 'SERVER_PORT': '9999', 'REMOTE_HOST': '', 'CONTENT_LENGTH': '', 'SCRIPT_NAME': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'SERVER_SOFTWARE': 'WSGIServer/0.2', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/favicon.ico', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1', 'CONTENT_TYPE': 'text/plain', 'HTTP_HOST': '127.0.0.1:9999', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_PRAGMA': 'no-cache', 'HTTP_CACHE_CONTROL': 'no-cache', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3823.400 QQBrowser/10.7.4307.400', 'HTTP_ACCEPT': 'image/webp,image/apng,image/*,*/*;q=0.8', 'HTTP_REFERER': 'http://127.0.0.1:9999/uiop/fas?name=fasdfa?jkl', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate, br', 'HTTP_ACCEPT_LANGUAGE': 'zh-CN,zh;q=0.9', 'wsgi.input': <_io.BufferedReader name=656>, 'wsgi.errors': <_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf-8'>, 'wsgi.version': (1, 0), 'wsgi.run_once': False, 'wsgi.url_scheme': 'http', 'wsgi.multithread': False, 'wsgi.multiprocess': False, 'wsgi.file_wrapper': <class 'wsgiref.util.FileWrapper'>}




<bound method BaseHandler.start_response of <wsgiref.simple_server.ServerHandler object at 0x0000015D648FFAC0>>
View Code
复制代码

有三个参数:

  1. <class '__main__.Application'>

    类本身

  2. 第二个参数为wsgiref传递的environ参数

  3. 第三个参数为wsgiref传递的start_response参数
    <bound method BaseHandler.start_response of <wsgiref.simple_server.ServerHandler object at 0x0000015D648FFAC0>>

     

server = make_server('', 9999, Application())

进行调用的时候,先执行classmethod装饰器,传递上述三个参数(__call__本来用作实例方法,此处使用装饰器@classmethod将其变成类方法),

classmethod会加入一个额外参数class类自身,但是wsgiref只能接收environ和start_response两个参数,所以报错

 

 

 

改为上述代码后,即可正常运行

 

 pycharm提示了如上信息,忽略即可

 

posted @   ascertain  阅读(88)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示