普通装饰器函数

计算函数的运行时间

import requests

import time

import re

# 黑名单

filter_urls = ['www.hao123.com', 'www.baidu.com', 'www.jd.com']

def filter_url(url): # 过滤url

print(url)

host = re.findall(r'http[s]?://(.*?)/', url)[0]

return host in filter_urls

# 测试网络请求的响应时间

def check_runtime(func):

print('--初始装饰--', func.__name__)

def wrapper(url, *args, **kwargs): # 闭包函数

# 判断url的 / path路径是否存在,如果不存在,则追加/

if url[7:].find('/') == -1 or url[8:].find('/') == -1:

url += '/'

if filter_url(url):

print('---已取消下载--:此url已在黑名单中')

return

# 获取开始请求的时间

start_time = time.time()

# result = func(*args, **kwargs)

result = func(url, *args, **kwargs)

delta_seconds = round(time.time() - start_time, 5)

print('[执行时间%.5f]' % delta_seconds)

return result

return wrapper # 返回一个包装函数(包装被装饰函数的参数列表)

@check_runtime

def request(url):

print('--开始请求--', url)

resp = requests.get(url)

print('--响应--', resp.status_code)

print(resp.content)

print('---完成请求---')

request('http://www.hao123.com')

带参数装饰器函数

带参数装饰器

设定权限(表) 8 查询(QUERY) 4 增加(ADD) 2 删除(DELETE) 1 修改(UPDATE) 0 无(NOSET)

设定角色——权限 admin 15(8421) | default, 8

设置用户-角色 disen: admin | cici: default

假如当前session中登录的用户是cici,其权限值为8

import time

current_rights = 8 # 当前登录用户的权限值

PERMISSION = (('QUERY', 8), ('ADD', 4), ('DELETE', 2), ('UPDATE', 1), ('NOSET', 0))

def get_permission(permission): # 根据权限名,返回权限值

for item in PERMISSION:

if permission in item:

return item[1]

def check_permission(permission):

print('--验证权限--', permission)

def wrapper1(func):

print('--初始化装饰函数--')

def wrapper2(*args, **kwargs):

# 检查当前用户的权限

permission_value = get_permission(permission)

# print(permission_value)

if current_rights & permission_value != permission_value:

print('当前用户没有权限')

return

result = func(*args, **kwargs)

return result

return wrapper2

return wrapper1

@check_permission('DELETE')

def delete_order(id):

print('当前用户 cici 正在删除订单:', id)

time.sleep(2)

print('删除成功!')

def add_permission(permission): # 添加权限

global current_rights

current_rights |= get_permission(permission)

# add_permission('DELETE')

delete_order(1010111)

不带参数的装饰器类

class Check():

def __init__(self, func):

self.func = func

def __call__(self, *args):

self.func(*args)

@Check

def login(uid):

print(uid)

被装饰的方法会传递给装饰器的构造器(__init__),然后在被装饰的函数被调用的时候,装饰器的__call__()方法就会执行

注意: 在装饰阶段,__init__ 函数执行,在被装饰的方法被调用的时候,__call__ 执行

带参数的装饰器类

class Check():

def __init__(self, name):

self.name = name

def __call__(self, func):

def wrapper(*args, **kwargs):

return func(*args, **kwargs)

return wrapper

@Check('log')

def login(uid):

print(uid)

__call__()会在装饰阶段被调用

带参数装饰器实现爬虫超时处理

import time

import requests

RETRY_TIME = 3

DOWNLOAD_DELAY = 2

class Retry(object):

def __init__(self,retries = 3,delay=0):

self.retries = retries

self.delay=delay

def __call__(self,func):

def wrapper(*args, **kwargs):

for i in range(self.retries):

try:

result=func(*args,**kwargs)

except Exception as e:

print(e)

time.sleep(self.delay)

continue

else:

return result

return wrapper

@Retry(RETRY_TIME,DOWNLOAD_DELAY)

def fetch(url):

print(f'Start fetch {url}')

resp = requests.get(url,timeout=5)

print(resp.status_code)

fetch('http://www.baidu.com')

python装饰器实例-python装饰器案例相关推荐

  1. python装饰器实例-python装饰器实例大详解

    原标题:python装饰器实例大详解 一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我 ...

  2. python装饰器实例-Python装饰器原理与简单用法实例分析

    本文实例讲述了Python装饰器原理与简单用法.分享给大家供大家参考,具体如下: 今天整理装饰器,内嵌的装饰器.让装饰器带参数等多种形式,非常复杂,让人头疼不已.但是突然间发现了装饰器的奥秘,原来如此 ...

  3. python装饰器实例-Python装饰器用法实例总结

    本文实例讲述了Python装饰器用法.分享给大家供大家参考,具体如下: 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能, ...

  4. python装饰器实例-Python函数装饰器--实例讲解

    一.装饰器定义: 1.装饰器的本质为函数: 2.装饰器是用来完成被修饰函数的附加功能的 所以:装饰器是用来完成被修饰函数附属功能的函数 装饰器的要求: 1.不能修改被修饰函数的源代码: 2.不能更改被 ...

  5. python装饰器实例-Python装饰器实用例子

    Python里我们经常能见到@开头的句法,也就是人们常说的装饰器(decorator).装饰器是Python非常重要的一部分,能够产出更易于维护的代码.这篇文章会给大家带来装饰器的介绍以及几个实用的例 ...

  6. python装饰器实例-Python装饰器简单用法实例小结

    本文总结分析了Python装饰器简单用法.分享给大家供大家参考,具体如下: 装饰器在python中扮演着很重要的作用,例如插入日志等,装饰器可以为添加额外的功能同时又不影响业务函数的功能. 比如,运行 ...

  7. python项目开发实例-Python项目案例开发从入门到实战——爬虫、游戏

    资料简介: 本书以Python 3.5为编程环境,从基本的程序设计思想入手,逐步展开Python语言教学,是一本面向广大编程学习者的程序设计类图书.本书以案例带动知识点的讲解,将Python知识点分解 ...

  8. python数据分析可视化实例-Python数据分析与可视化从入门到精通

    (1)没有高深理论,每章都以实例为主,读者参考书中源码运行,就能得到与书中一样的结果.(2)专注于Python数据分析与可视化操作中实际用到的技术.相比大而全的书籍资料,本书能让读者尽快上手,开始项目 ...

  9. python简单程序实例-python简单项目实例

    语言多元化是PayPal编程文化中一个重要的组成部分.在C++和Java长期流行的同时,更多的团队选择了Jva和Scala.同时,Braintree的收购也引入了一个久经世故的Ruby社区.Pytho ...

  10. python爬虫入门实例-Python爬虫天气预报实例详解(小白入门)

    本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下. 要求是把你所在城市过去一年的历史数据爬出来. 分析网站 我们可以看到,我们需要的天气数据都是放在图表上的,在切换月份的时候,发现只有 ...

最新文章

  1. 算法 - 交换排序(C++)
  2. git merge --squash改写提交
  3. VTK:Utilities之KnownLengthArray
  4. css 选择href属性值,巧用CSS属性值正则匹配选择器(小技巧)
  5. readyState属性和status属性
  6. webpack源码分析(2)---- webpack\bin\webpack.js
  7. VMware Workstation 与 Server 的区别
  8. mysql 瓶颈诊断_MySQL 监控、性能瓶颈排查
  9. 关于ArcGIS Mobile回传数据中常遇到的问题整理!
  10. 阿里巴巴正式上线全球首个数据中心Open Channel SSD产品
  11. css中hack是什么
  12. 关于rem自适应的一点研究
  13. java开源打印控件_这个WEB打印控件略牛逼,还免费
  14. 桥本分数式c语言,《算法设计与分析教案(新格式)》.doc
  15. 【JY】橡胶支座的简述和其力学性能计算
  16. 09年国内外免费杀毒软件大收罗
  17. 线性高电压稳压器的制作
  18. 论文研读 —— 6. ImageNet Classification with Deep Convolutional Neural Networks (2/3)
  19. 图像处理用什么神经网络,神经网络图像处理
  20. 【自然语言处理】【ChatGPT系列】大模型的涌现能力

热门文章

  1. java报表工具FineReport使用中遇到的常见报错及解决办法(三)
  2. 基于RTP的h.264视频传输系统(二)
  3. 希望控件【解决】mfc grid control问题:无水平滚动条(scrollbar)、垂直滚动条只有向上部分、向下部分看不到...
  4. 微软企业库4.1学习笔记(六)创建对象
  5. ListView用法
  6. 资深专家给.NET初学者的学习建议(转)
  7. 表格边框重复合并属性: border-collapse:collapse;
  8. 2016-2017 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2016)
  9. MySQL 5.6.6 LABS 版本 下载 已经内含 Memcached
  10. Best jQuery Plugins of 2010