python装饰器

python 单例装饰器

匿名 (未验证) 提交于 2019-12-02 22:51:30
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-12-02 22:51:30
附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): return 3 @register def b(): return 5 # 访问结果 result = [func() for func in funcs] 注册表隔离(使用类的不同实例) class Registry(object): def __init__(self): self._funcs = [] def register(self, func): self._funcs.append(func) def run_all(self): return [func() for func in self._funcs] r1 = Registry() r2 = Registry() @r1.register def a(): return 3 @r2.register def b(): return 5 @r1.register @r2

python高阶函数、柯里化、装饰器、参数注解

匿名 (未验证) 提交于 2019-12-02 22:51:30
一、高阶函数 举例: def counter(base): def inc(step=1) base += step return base return inc 1、自定义sort函数 仿照内建函数sorted,自行实现一个sort函数(不使用内建函数),能够为列表元素排序 内建函数sorted函数是返回一个新的列表,可以设置升序或者降序,可以设置一个排序的函数 sorted函数的实现原理,扩展到map,filter函数的实现原理 方式一: def sort(iterable,reverse=False): ret = [] for x in iterable: for i,y in enumerate(ret): flag = x>y if reverse else x<y if flag: #找到大的就地插入 ret.insert(i,x) break else: ret.append(x) return ret print(sort([1,3,4,52,6,10]) 方式二: def sort(iterable,fn=lambda a,b:a>b): ret = [] for x in iterable: for i,y in enumerate(ret): if fn(x,y): #fn函数的返回值是bool ret.insert(i,x) break else: ret

Python基础10/内置函数/闭包

匿名 (未验证) 提交于 2019-12-02 22:51:30
1.内置函数(二) 2.闭包 #(abs()) 绝对值--返回的都是正数 #print([abs(i) for i in lst]) #enumerate -- 枚举("可迭代对象","序号的起始值") #[(0,1),(1,2),(2,3)] #print([i for i in enumerate(lst,10)]) # lst = [11,22,33,-44,23,21] # new_lst = [] # for i in enumerate(lst): # new_lst.append(i) # print(new_lst) # print([i for i in enumerate(lst,1000)]) # print(max([1,2,3,4,56,7,8])) # 求最大值 # print(min([1,2,3,4,-56,7,8])) # 求最小值 # print(sum([1,2,3,4,5],100)) # 求和 range Python3: g = range(0,10) 可迭代对象 g.__iter__() Python2: range(0,10) 获取是一个列表 xrange(0,10) 获取是一个可迭代对象 # from collections import Iterable,Iterator # print(isinstance(g,Iterable

python 多个装饰器的调用顺序

匿名 (未验证) 提交于 2019-12-02 22:51:30
一般情况下,在函数中可以使用一个装饰器,但是有时也会有两个或两个以上的装饰器。多个装饰器装饰的顺序是从里到外(就近原则),而调用的顺序是从外到里(就远原则)。 被装饰的函数,组装装饰器时,是从下往上装饰 装饰器调用时是从上往下调用 被装饰的函数是一个妹子,装饰器是衣服。“办事情”的时候得依次把外套、衬衣、内衣脱掉,事情办完了还要依次把内衣、衬衣、外套穿上。距离“妹子”越近的装饰器代表越贴身的衣服。

Python 闭包和装饰器的讲解

匿名 (未验证) 提交于 2019-12-02 22:51:30
1, 闭包。 一、定义说明: 在Python中,函数内部可以定义函数(函数名其实就是指向一段内存空间的地址,即函数名就是函数的入口地址)。 闭包函数必须满足两个条件: 1.函数内部定义的函数 2.包含对外部作用域而非全局作用域的引用。 例1: def a(a, b): def c(x): return a*x + b print(c.__closure__) return c # 调用 print(a(3, 4)(8)) 二、优缺点说明 1、实现了代码的可复用性 2、闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成 3、由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存(闭包调用时候,如果内部函数没有调用,其内存资源得不到释放。) 2,装饰器 一、定义 装饰器:外部函数传入被装饰函数名,内部函数返回装饰函数名。 特点:1.不修改被装饰函数的调用方式 2.不修改被装饰函数的源代码 python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用修改原函数的代码前提下给函数增加新的功能。其实通俗一点讲,其实装上器就是闭包的功能的扩展。 举例: def w1(func): def inner(): # 验证1 # 验证2 # 验证3 func() return inner @w1

python装饰器理解

匿名 (未验证) 提交于 2019-12-02 22:11:45
作为小白,在学python装饰器时,真的是很抓狂,看了几遍廖雪峰老师的教程后还是不理解,先后也找了几篇有关python装饰器的博客来看,才可以勉强理解装饰器的含义 python装饰器其实就是python中的一个语法,不用它也同样可以实现你想要的功能,只是相较而言需要更多的代码,使用装饰器来说会简洁而方便一些 简单了解python装饰器可以分几步 第一步:了解简单的函数性质 函数也是对象,python函数具有对象的所有性质 (1)它有 id ,有 type ,有值。 (2)可以赋值可以给变量 def MyPython(): return 'I Love Python' MyPython1=MyPython   注意:把函数赋值给变量时候,是把函数名赋值给变量,不要写成 MyPython1=MyPython()这是错误的,MyPython()是执行了函数,把函数的返回值赋给了变量MyPython1(3)可当参数传递,也可以当返回值因为是具有变量的性质,所以变量可以干啥它就可以干啥 def MyPython(MyChildren): ... print(MyChildren()) ... return MyChilren ... def MyPython1(): print(“I Love Python”) f=MyPython(MyPython1) f() 文章来源:

面试题总结

大憨熊 提交于 2019-12-02 18:38:59
1、一行代码实现1--100之和 利用sum()函数求和 >>> sum(range(0,101)) 5050 2、如何在一个函数内部修改全局变量 利用global 修改全局变量 a = 5 def fn(): global a a = 4 fn() print(a) 3 、列出5个python标准库 os:提供了不少与操作系统相关联的函数 sys: 通常用于命令行参数 re: 正则匹配 math: 数学运算 datetime:处理日期时间 4、字典如何删除键和合并两个字典 del和update方法 >>> dic = {"name":"zs", "age":18} >>> del dic["name"] >>> dic {'age': 18} >>> dic2 = {"name":"ls"} >>> dic.update(dic2) >>> dic {'age': 18, 'name': 'ls'} 5、谈下python的GIL GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。

Python学习

梦想与她 提交于 2019-12-02 18:17:37
安装Python 下载链接(3.8) https://www.python.org/ftp/python/3.8.0/python-3.8.0.exe 安装勾选“Add Python 3.8 to PATH” CMD测试安装成功:输入python回车查看安装状态 Python解释器 1、 Cpython C语言开发,官方默认解释器 2、 Ipython 交互上较Cpython有所增强,执行功能与CPython一样 3、 PyPy 执行速度快,采用JIT技术,对代码进行动态编译(非解释) 绝大部分代码都能运行在PyPy上,但可能与Cpython的执行结果不同,注意甄别 https://pypy.readthedocs.io/en/latest/cpython_differences.html 4、 Jython java平台的解释器,可以把Python代码编译成Java字节执行 5、 IronPython 与Jython类似,只不过这个运行在微软.Net上的Python解释器,可以直接把Python代码编译成.Net的字节码 写Python程序 Python交互模式 在命令行模式下敲命令python,然后就进入到Python交互模式,它的提示符是>>> 输入exit()并回车推出Python交互模式 编辑Python代码 使用任意文本编辑器都可以,但不能使用记事本和word