python装饰器

python 单例装饰器

纵然是瞬间 提交于 2019-11-30 17:56:54
Python中单例模式的实现方法有多种,但在这些方法中属装饰器版本用的广,因为装饰器是基于面向切面编程思想来实现的,具有很高的解耦性和灵活性。 单例模式定义:具有该模式的类只能生成一个实例对象。 def singlecls(cls, *args,**kwargs):   instace = {}   def get_instance(cls, *args, **kwargs):     if cls not in instace:       instances[cls] = cls(*args, **kwargs)     return instance[cls]   return get_instace      @singlecls class A(object):   def __init__(self):     pass A = singlecls(A) 在创建实例对象时会先将 A 作为参数传入到 singlecls 函数中,函数在执行过程中不会执行 get_instance 函数(函数只有调用才会执行),直接返回get_instance函数名。 此时可以看作 A = get_instance,创建实例时相当于 a= get_instance(),调用get_instance 函数,先判断实例是否在字典中,如果在直接从字典中获取并返回, 如果不在执行 instances

python请求网络失败时重复提交

南楼画角 提交于 2019-11-30 17:32:59
在使用python抓取网络内容的时候,如遇网络问题常常需要重复提交,而不是简单退出。考虑到重用性,可利用python装饰器实现。 class retry(object): def __init__(self,*,times): self._cnt=times def __call__(self,func): def wrapper(*args,**kw): data=None cnt=self._cnt while data==None and cnt>0: data=func(*args,**kw) cnt-=1 return data return wrapper 装饰器接收times参数,可控制重复次数,如果函数返回None则重复执行,否则返回结果。 封装请求函数: @retry(times=3) def getUrl(url): try: return requests.get(url,timeout=60) except requests.exceptions.ConnectionError: return None except requests.exceptions.ConnectTimeout: return None except requests.exceptions.Timeout: return None 如果希望终止重复,则可以直接抛出异常。 来源:

三分钟搞定Python中的装饰器

有些话、适合烂在心里 提交于 2019-11-30 14:58:14
python的装饰器是python的特色高级功能之一,言简意赅得说,其作用是在不改变其原有函数和类的定义的基础上,给他们增添新的功能。 装饰器存在的意义是什么呢?我们知道,在python中函数可以调用,类可以继承,为何要必须保证不改变函数和类的定义,就使得函数有了新的功能呢?其实很好解释。 提高代码的简洁程度与封装性。如果你采用新声明一个函数,并调用原来函数的思路使得原函数功能增加了,但是一方面使用起来看着不简洁, 另一方面当另一个程序员使用你的代码时再使用这样的思路,那代码嵌套无穷无尽,会让代码变得很乱,说不定改错了哪里,动了原函数哪个参数,就会出现发现不了的bug。 我们先来看一个简单的例子。 def addworld(func): def addfun(): return func() + 'world' return addfun() @addworld def printhello(): return 'hello' print(printhello) 这段代码最后运行出来的结果是helloworld。我们发现,只要在原函数头上加一个你定义好了的增添功能的模板,以后凡是加上这个,都会增添一个功能,这提高了开发效率,也看着更加简洁。 def addnum(func): def addfun(*args, **kwargs): ret = func(*args, *

百万年薪python之路 -- 装饰器进阶

假如想象 提交于 2019-11-30 12:32:15
本文链接:https://blog.csdn.net/xiemanR/article/details/72510885 一:函数装饰函数 def wrapFun(func): def inner(a, b): print('function name:', func.__name__) r = func(a, b) return r return inner @wrapFun def myadd(a, b): return a + b print(myadd(2, 3)) 二:函数装饰类 def wrapClass(cls): def inner(a): print('class name:', cls.__name__) return cls(a) return inner @wrapClass class Foo(): def __init__(self, a): self.a = a def fun(self): print('self.a =', self.a) m = Foo('xiemanR') m.fun() 三:类装饰函数 class ShowFunName(): def __init__(self, func): self._func = func def __call__(self, a): print('function name:', self._func.

python-------装饰器

。_饼干妹妹 提交于 2019-11-30 07:17:13
一、简单的装饰器 1.为什么要使用装饰器呢?   装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展   装饰器的本质:就是一个闭包函数 那么我们先来看一个简单的装饰器:实现计算每个函数的执行时间的功能 1 import time 2 def wrapper(func): 3 def inner(): 4 start=time.time() 5 func() 6 end=time.time() 7 print(end-start) 8 return inner 9 10 def hahaha(): 11 time.sleep(1) 12 print('aaaaa') 13 hahaha=wrapper(hahaha) 14 hahaha() 15 16 简单的装饰器 简单的装饰器 View Code 上面的功能有点不简介,不完美,下面就引进了语法糖。 1 import time 2 def wrapper(func): 3 def inner(): 4 start=time.time() 5 func() 6 end=time.time() 7 print(end-start) 8 return inner 9 @wrapper 10 def kkk():#相当于kkk=wrapper(kkk) 11 print('aaaaa') 12 kkk() 13 14

Python从入门到放弃

余生长醉 提交于 2019-11-30 06:21:38
第一篇 markdown编辑器 001 markdown基本语法 第二篇 计算机基础 002 计算机基础之编程 003 计算机组成原理 004 计算机操作系统 005 编程语言分类 006 网络的瓶颈效应 007 计算机基础小结 第三篇 Python解释器和集成环境 008 Python和Python解释器 009 Python解释器安装 010 Anaconada安装(选做) 011 Python解释器镜像源修改 012 执行Python程序的两种方式 013 Python的IDE之Pycharm的使用 014 Python的IDE之Jupyter的使用 015 pip的使用 016 Python解释器和Python集成环境小结 第三篇 Python基础 017 变量 018 常量 019 Python变量内存管理 020 变量的三个特征 021 花式赋值 022 注释 023 数据类型基础 024 数字类型 025 字符串类型 026 列表类型 027 字典类型 028 布尔类型 029 解压缩 030 Python与用户交互 031 格式化输出的三种方式 032 基本运算符 033 流程控制之if判断 034 流程控制之while循环 035 流程控制之for循环 036 Python基础小结 037 Python基础实战之猜年龄游戏 第四篇 Python进阶 038

Python装饰器完全解读

社会主义新天地 提交于 2019-11-30 05:47:24
1 引言 装饰器(Decorators)可能是Python中最难掌握的概念之一了,也是最具Pythonic特色的技巧,深入理解并应用装饰器,你会更加感慨——人生苦短,我用Python。 2 初步理解装饰器 2.1 什么是装饰器 在解释什么是装饰器之前,我们有必要回顾一下Python中的一些思想和概念。我们都知道,Python是一门面向对象的语言,Python基本思想就是一些皆对象,数据类型是对象、类是对象、类实例也是对象……对于接下来我们要说的装饰器而言,最重要的是,函数也是对象! 你没看错,函数也和数据类型等概念一样,都是对象,那么既然数据类型可以进行赋值操作,那么函数是不是也可以赋值呢?当然可以! def do_something(): print('完成一些功能') if __name__ == '__main__': do = do_something do() 输出: 完成一些功能 看,原本我们定义的函数名是do_something,但我们把函数赋值给do后,也可以通过do()调用函数。不仅如此,函数当做参数传递给其他函数: ''' 遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书! ''' def do_something(): print('正在完成功能')

Python核心技术与实战 笔记

人盡茶涼 提交于 2019-11-30 03:26:27
基础篇 Jupyter Notebook 优点 整合所有的资源 交互性编程体验 零成本重现结果 实践站点 Jupyter 官方 Google Research 提供的 Colab 环境 安装 运行 列表与元组 列表和元组,都是 一个可以放置任意数据类型的有序集合 。 l = [1, 2, 'hello', 'world'] # 列表中同时含有 int 和 string 类型的元素 l [1, 2, 'hello', 'world'] tup = ('jason', 22) # 元组中同时含有 int 和 string 类型的元素 tup ('jason', 22) 列表是动态的,长度大小不固定,可以随意地增加、删减或者改变元素 (mutable) 元组是静态的,场地大小固定,无法增加删除或者改变 (immutable) 都支持负数索引; 都支持切片操作; 都可以随意嵌套; 两者可以通过 list() 和 tuple() 函数相互转换; 列表和元组存储方式的差异 由于列表是动态的,所以它需要存储指针,来指向对应的元素。增加/删除的时间复杂度均为 O(1)。 l = [] l.__sizeof__() // 空列表的存储空间为 40 字节 40 l.append(1) l.__sizeof__() 72 // 加入了元素 1 之后,列表为其分配了可以存储 4 个元素的空间 (72 -

python闭包和装饰器

妖精的绣舞 提交于 2019-11-30 03:18:55
闭包 定义:两个函数的嵌套,外部函数返回内部函数的引用,内函数运用了外部函数参数传入的临时变量。 作用:装饰器的实现,提高代码的复用性 缺点:引用了外部函数的局部变量,该变量没有及时释放,消耗内存 模板:def 外部函数(a): ------必须含有参数,否则无嵌套的意义 def 内部函数(b): ------参数可有可无, print(a+b) -----参数的运算操作 return 内部函数 ------外部函数返回内部函数的引用 调用:外部函数() ------ 调用外部函数 func = 外部函数() func()-------调用内部函数 装饰器 定义:一种特殊的函数,由两个函数嵌套(即闭包)实现 作用:在不修改函数的参数及返回值的前提下,对函数增加额外功能 使用场景:插入日志,函数执行时间统计,函数前后操作处理,权限校验,缓存等 万能装饰器模板: def get_fun(func): ------外部函数,参数是传入的原函数 def call_fun(*args.**kwargs): ------内部函数,是装饰后函数的引用 print("增加功能“) ------为原函数添加功能的代码 return func(*args,**kwargs) ------原函数的调用,return可返回原函数的返回值 return call_fun ------外部函数返回内部函数

python中的装饰器

非 Y 不嫁゛ 提交于 2019-11-30 03:07:35
什么是装饰器? 装饰器就是做装饰的,装饰谁?装饰的是函数,也就是给函数化妆。为什么要给函数化妆呢?其实就是要给函数添加一些功能,为什么要用装饰器呢?为啥不能直接修改函数呢?简单粗暴!因为加上装饰器的话,可以不改变人家原来的函数,防止你乱改人家代码出错,可维护性更好 假如我们要给一个返回字符串的函数加上标签 >>> def say_hello(name): return "Hello "+name+"!" >>> def p_decorate(func): def func_wrapper(name): return '<p>'+func(name)+'</p>' return func_wrapper >>> my_say_hello=p_decorate(say_hello) >>> my_say_hello("xiaoming") '<p>Hello xiaoming!</p>' >>> 装饰器是什么原理呢? 其实就是将原来的函数加一些功能变成一个新的函数,然后再把这个新的函数返回 比如p_decorate函数会返回一个装饰好的新函数func_wrapper func_wrapper函数负责给say_hello函数化妆,也就是加新的东西,其调用原来的函数加上标签 最后p_decorate函数将化妆好的func_wrapper函数返回 这样我们将say_hello函数传入装饰器