47 单例模式 和装饰器
一.装饰 器
不改变被装饰函数原来的执行方式 给原函数增加一些额外的功能,登录验证,打印日志,测试效率等。
1.简单版装饰器
import time #装饰器def timer(f) :def inner():#被装饰函数执行前 要做的事情start_time = time.time()res = f() #被装饰的函数#被装饰函数执行后 要做的事情end_time = time.time()print("函数执行时间:",end_time-start_time)return resreturn inner @timer #相当于 func = timer(func) #被装饰函数def func(x,y): print(x+y) return x+y func()
2.带参数的装饰器
带参数装饰器一 :控制装饰器的关和开
# 带参数的装饰器 可以同时控制装饰器的启用和关闭 import time def timmer(flag):def wrapper(f):def inner(*args, **kwargs):if flag:start_time = time.time()ret = f(*args, **kwargs)end_time = time.time()print('执行时间%s' % (end_time-start_time))return retelse:ret = f(*args, **kwargs)return retreturn innerreturn wrapperflag1 = False @timmer(flag1) # 第一步,将@ 与后面 分开,只是单纯的执行timmer(flag1)函数 第二步 将@ 与 wrapper相结合,形成装饰器 def func1():time.sleep(0.3)print('in func1')@timmer(flag1) def func2():time.sleep(0.3)print('in func2')@timmer(flag1) def func3():time.sleep(0.3)print('in func3')func1() func2() func3()
带参数装饰器二 :
# 做一个带参数的装饰器: # 访问JD JD_shop 输入京东的账号密码 # 访问taobao tianmao_shop() 输入支付宝的账号密码 status = {"username":None,"京东":False,"淘宝":False } def login(flag):def wapper(f):def inner(*args,**kwargs):if status[flag]:res = f(*args,**kwargs)return reselse:print("-----登录页面-------")username = input("请输入用户名:").strip()password = input("请输入密码:").strip()with open(flag,"r",encoding="utf-8") as f1:for line in f1:user,pwd = line.strip().split("|")if user.strip() == username and password == pwd.strip():status [flag] = Trueprint("登录成功!")res = f(*args, **kwargs)return reselse:print("登录失败!")return innerreturn wapper@login('京东') def JD():print("-----欢迎进入京东首页!------") @login('京东') def JD_shop():print("-----欢迎进入京东商店!------")@login('淘宝') def taobao():print("-----欢迎进入淘宝首页!------") @login('淘宝') def tianmao_shop():print("-----欢迎进入天猫超市!------")JD() JD_shop() taobao() tianmao_shop()
3. 多个装饰器,装饰同一个函数
#多个装饰器 装饰一个函数def wrapper1(func): # func == f 函数名def inner1():print('wrapper1 ,before func') # 2 func()print('wrapper1 ,after func') # 4return inner1def wrapper2(func): # func == inner1def inner2():print('wrapper2 ,before func') # 1 func()print('wrapper2 ,after func') # 5return inner2# 就近原则 @wrapper2 # f = wrapper2(f) 里面f == inner1 外面的f == inner2 @wrapper1 # f = wrapper1(f) 里面的f == 函数名f 外面的f == inner1 def f():print('in f') # 3 f() # inner2()
二. 单例模式
#单例模式 :只能创建同一个实例对象 class A:def __new__(cls, *args, **kwargs):print(111)obj = object.__new__(cls)return objdef __init__(self):print(222) obj1 = A()class A:__instance = Nonedef __new__(cls, *args, **kwargs):if A.__instance is None:obj = object.__new__(cls)A.__instance = objreturn A.__instance obj1 = A() obj2 = A() obj3 = A() obj4 = A() print(obj1) print(obj2) print(obj3) print(obj4)
转载于:https://www.cnblogs.com/knighterrant/p/10159182.html
47 单例模式 和装饰器相关推荐
- python grpc unary call错误_python的黑魔法-装饰器
python的装饰器 装饰器 简单的来说就是函数的函数,在执行目标函数时,先执行装饰器函数,很像HOOk 简单的装饰器 实现一个打印日志的装饰器 def myLogger(func):def wrap ...
- 从未这么明白的设计模式(三):装饰器模式
本文原创地址:jsbintask的博客(食用效果最佳),转载请注明出处! 同系列文章: 从未这么明白的设计模式(二):观察者模式 从未这么明白的设计模式(一):单例模式 前言 装饰器模式是为了运行时动 ...
- python装饰器模式带参数_Python装饰器使用实例:验证参数合法性 请教Python 使用装饰器实现单例模式的原理...
python中一层装饰器的函数可以带参数吗 可以的, 装饰器分为可带参数和不可带参数的两种:但是如果带参数,则带参数装饰器的"参数"及"return"必须也是一 ...
- python单例模式原理-请教Python 使用装饰器实现单例模式的原理
扩展回答 如何理解Python装饰器 简单来讲,可以不严谨地把Python的装饰器看做一个包装函数的函数. 比如,有一个函数: def func(): print "func() run.& ...
- python装饰器实现单例模式_请教Python 使用装饰器实现单例模式的原理
1 简单来讲,可以不严谨地把Python的装饰器看做一个包装函数的函数. 比如,有一个函数: def func(): print 'func() run.' if '__main__' == __na ...
- python 类装饰器和继承_python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)...
介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. 1 #coding= ...
- Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)
属性取值和赋值过程 一切皆是对象,类型也是对象. 对象包含一个__class__属性指向其所属类型. 对象包含一个__dict__属性指向其所包含的成员(属性和方法). 取值过程(下面是伪代码) 1 ...
- python装饰器-Python——装饰器(Decorator)
1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...
- python装饰器实例-Python装饰器实用例子
Python里我们经常能见到@开头的句法,也就是人们常说的装饰器(decorator).装饰器是Python非常重要的一部分,能够产出更易于维护的代码.这篇文章会给大家带来装饰器的介绍以及几个实用的例 ...
最新文章
- 升讯威微信营销系统开发实践:(3)功能介绍与此项目推广过程的一些体会( 完整开源于 Github)...
- java让服务器停止运行,java调用远程服务器的shell脚本以及停止的方法实现
- 大型科技公司架构:中台模式的爱与恨
- Linux关机重启流程分析
- Java中大规模集合快速求和计算
- mysql 命令 utf8_Mysql 统一设置utf8字符
- 三人表决器_数电小实验之三人表决器
- 【五级流水线CPU】—— 7. 协处理器访问指令(2条)
- AngularJS指令范围中的#39;@#39;和#39;=#39;有什么区别?
- MongoDB在RHEL6.5下的安装
- 【数据分析与科学计算可视化】numpy 和 matplotlib库总结
- 树莓派控制超声波测距原理及实现
- 数据分析之FineReport
- Ubuntu 可视化图片——eog
- Linux系统u盘win7没驱动程序,u盘安装win7找不到设备驱动程序,教您解决u盘安装win7找不到设备驱动程序...
- 安装python3.8出现ModuleNotFoundError: No module named ‘_ctypes’解决办法
- leetcode 会员转让
- HGOI 20190821 慈溪一中互测
- 使用iso安装linux系统安装教程,史上最详细linux安装教程
- Google是如何提供“无缝”的街景全景图的?
热门文章
- [转]ubuntu下ATI/Intel双显卡切换的方法
- opensuse 12.1 启动脚本
- soap方式的远程调用示例代码
- Java实现ftp的上传、下载和删除
- android项目允许命令,android 项目 gradle 命令
- java1到100的数组_用java定义一个数组,长度为3: 1)循环输入数组元素值(元素值在1到100之间)...
- win10怎么设置开机启动项目_开机启动项怎么设置呢?禁用自启动程序
- 【干货】运维,你是青铜还是王者?
- 阿里云边缘容器服务、申通 IoT 云边端架构入选 2021 云边协同发展阶段性领先成果
- composer php 使用方法,Composer的基本使用方法