通过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类中加入这个方法可能是为了提升一点点性能 ...
随机推荐
- C++日常应用-定时器
定时器的使用:分为有句柄 无句柄两类 有句柄情况下的使用:头文件: 1.添加映射 BEGIN_MSG_MAP(类名) MESSAGE_HANDLER(WM_TIMER, OnTimer) END_MS ...
- Windows和MacOS的比较——不断完善和补充,欢迎吐槽
1. 鼠标滚轮的方向不一样,Windows上滚轮朝下,页面滚动条也会朝下.而Mac上则相反. 2. Windows上有Home和End键,经常可以Ctrl+Home,Ctrl+End,Ctrl+Shi ...
- golang初识3 - func
1. 功能块(function block) 格式: func function_name( [parameter list] ) [return_types] { //body } 与delphi的 ...
- localStorage sessionStorage 用法
sessionStorage.getItem('key') // 获取 sessionStorage.setItem('key','value') //设置 sessionStorage.remove ...
- WPF xml配置文件里面的大于小于号转义
转义字符:<![CDATA[]]>,将要转义的字符放到中括号中,比如要转小于号:<,则换为<![CDATA[<]]> <?xml version=" ...
- 使用plot_importance绘制特征重要性曲线
代码如下所示: # -*- coding: utf-8 -*- #导入需要的包 import matplotlib.pyplot as plt from sklearn import datasets ...
- ef err
InvalidCastException: The field of type jcz.DomainModels.Sex must be a string, array or ICollection ...
- rownum用法
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀. ...
- node环境
下载教程:http://www.runoob.com/nodejs/nodejs-install-setup.html 选择版本下载:https://nodejs.org/en/download/ 输 ...
- ubuntu环境下安装docker遇到的坑
ubuntu安装docker的前提条件是: 1. Linux 的内核版本在 3.10 或以上: 2. linux 内核要开启 cgroup 和 namespace 功能 可以执行命令:uname –a ...