通过decorators = [,] 的形式给类中的所有方法添加装饰器
给类添加装饰器有多种方法:
1.可以在类中的某个方法上边直接@添加,这个粒度细.无需详细介绍
2.也可以在类中通过 decorators=[, ]的形式添加,这样的话,类中的所有方法都会被一次性加上装饰器,粒度粗:
列表中多个装饰器的话,装饰器的添加顺序:
列表中: 从前 -> 往后,对应:
函数上边: 从下 -> 到上
下边以一个简单的flask项目为例演示一遍
# app.py内容 import time
from flask import Flask, views
from flask import render_template, redirect, request app = Flask(__name__) # 装饰器1
def print_time(func):
def inner(*args, **kwargs):
st = time.time()
ret = func(*args, **kwargs)
et = time.time()
print("use time: {}".format(et - st))
return ret return inner # 装饰器2
def say_hi(func):
def inner(*args, **kwargs):
print("第二层装饰器开始")
ret1 = func(*args, **kwargs)
et = time.time()
print("第二层装饰器结束")
return ret1 return inner class Login(views.MethodView):
# decorators = [print_time, say_hi]
# 顺序相当于:
# @say_hi
# @print_time
# 结果:
# 第二层装饰器开始
# use time: 0.005026817321777344
# 第二层装饰器结束 decorators = [say_hi, print_time]
# 顺序相当于:
# @print_time
# @say_hi
# 结果:
# 第二层装饰器开始
# 第二层装饰器结束
# use time: 0.006980419158935547 def get(self, *args, **kwargs):
return render_template("login.html") def post(self, *args, **kwargs):
print(
request.files) # ImmutableMultiDict([('myFile', <FileStorage: 'vim常用命令总结.md' ('application/octet-stream')>)])
print(request.files.get("myFile")) # < FileStorage: 'vim常用命令总结.md' ('application/octet-stream')>
my_file = request.files.get("myFile")
my_file.save(my_file.filename)
return "" app.add_url_rule("/login", view_func=Login.as_view(name="login")) if __name__ == '__main__':
app.run()
<!-- templates/login.html中内容 --> <!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="content-Type" charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<input type="text" name="username">
<input type="file" name="myFile">
<input type="submit" value="提交">
</form>
</body>
</html>
通过decorators = [,] 的形式给类中的所有方法添加装饰器的更多相关文章
- python 类中的某个函数作为装饰器
在python的类中,制作一个装饰器的函数, class A: def wrapper(func): ###装饰器 def wrapped(self,*arg,**kwargs) ... return ...
- django class类即视图类添加装饰器的几种方法
根据别人发布整理,个人爱好收集(原文:https://blog.csdn.net/mydistance/article/details/83958655 ) 第一种:定义函数装饰器,在函数,类中使用函 ...
- StringBuilder类中的重要方法
下面的API注解包含了StringBuilder类中的重要方法 append(boolean b):将 boolean 参数的字符串表示形式追加到序列. append(char c):将 char 参 ...
- Effective Java 第三版——16.在公共类中使用访问方法而不是公共属性
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 静态内部类定义在类中,任何方法外,用static定义
静态内部类:(注意:前三种内部类与变量类似,所以可以对照参考变量) 静态内部类定义在类中,任何方法外,用static定义. 静态内部类只能访问外部类的静态成员. 生成(new)一个静态内部类不需要外部 ...
- Java中是否可以调用一个类中的main方法?
前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...
- 重写Object类中的equals方法
Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类 public class Student { //姓名.学号.年纪 private S ...
- PHP通过反射方法调用执行类中的私有方法
PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php //MyClass这个类中包 ...
- Java String类中的intern()方法
今天在看一本书的时候注意到一个String的intern()方法,平常没用过,只是见过这个方法,也没去仔细看过这个方法.所以今天看了一下.个人觉得给String类中加入这个方法可能是为了提升一点点性能 ...
随机推荐
- python守护进程
1.守护进程 [1]使用runner这个模块直接创建守护进程,非常方便. [2]运行方法:python xxx.py start|stop|restart [3]调用python xxx.py sto ...
- linux centos7下mysql安装--韩国庆
首先我先给大家介绍下MariaDB和mysql的区别. 上图,“MySQL之父”的骨灰级程序员Monty,但是mysql被Oracle收购后,Monty又开始去发展另一条数据库的道路,并且以Monty ...
- mac更新node,npm版本
最近开发发现node版本多低的提示,于是升级一下 # 清除node.js的cache: $ sudo npm cache clean -f # 安装 n 工具,专门用来管理node.js版本的工具 $ ...
- Python常用高级函数
一 .匿名函数 有些时候,我们不需要显式的定义函数,可以使用匿名函数临时快速定义函数. lambda x: x * x 关键字lambda表示匿名函数,冒号前面的x表示函数的参数,多个参数用','隔开 ...
- C#实现多个PDF合并及去除文字水印功能
实现pdf合并就是使用Spire.Pdf.dll类库的方法,但是注意需要同时引用Spire.Pdf.dll和Spire.License.dll两个类库,且两个类库的版本要一致 String[] fil ...
- windows快速搭建FTP工具Serv-U FTP Server
本文介绍一个简单的FTP工具,当然windows系统自带FTP工具,但是配置方法没有第三方工具来的简单可操作性好. 此工具用于搭建FTP环境,对于需要测试FTP上传功能具有极大帮助.例如球机抓拍图片上 ...
- python基础1.0
1. python简介:解释性语言 安装python,注意路径加入path python的解释器,cpython,Python的解释器很多,但使用最广泛的还是CPython.如果要和Java或.Net ...
- linux随机字符串
pwgen -s 32 1 openssl passwd -salt openssl rand -base64 32 openssl rand -hex 100
- js:一些基础
JavaScript 基础(一) JavaScript的引入方式 直接编写 <!DOCTYPE html> <html lang="en"> <h ...
- nvm管理node版本
一.介绍与作用 不同的项目中可能使用的node版本不同,对于维护多个版本的node就是一件麻烦事了,而nvm就可以很方便的管理不同的node版本, 可以在不同的node版本间切换使用.NVM资源(针对 ...