一.装饰 器

  不改变被装饰函数原来的执行方式 给原函数增加一些额外的功能,登录验证,打印日志,测试效率等。

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 单例模式 和装饰器相关推荐

  1. python grpc unary call错误_python的黑魔法-装饰器

    python的装饰器 装饰器 简单的来说就是函数的函数,在执行目标函数时,先执行装饰器函数,很像HOOk 简单的装饰器 实现一个打印日志的装饰器 def myLogger(func):def wrap ...

  2. 从未这么明白的设计模式(三):装饰器模式

    本文原创地址:jsbintask的博客(食用效果最佳),转载请注明出处! 同系列文章: 从未这么明白的设计模式(二):观察者模式 从未这么明白的设计模式(一):单例模式 前言 装饰器模式是为了运行时动 ...

  3. python装饰器模式带参数_Python装饰器使用实例:验证参数合法性 请教Python 使用装饰器实现单例模式的原理...

    python中一层装饰器的函数可以带参数吗 可以的, 装饰器分为可带参数和不可带参数的两种:但是如果带参数,则带参数装饰器的"参数"及"return"必须也是一 ...

  4. python单例模式原理-请教Python 使用装饰器实现单例模式的原理

    扩展回答 如何理解Python装饰器 简单来讲,可以不严谨地把Python的装饰器看做一个包装函数的函数. 比如,有一个函数: def func(): print "func() run.& ...

  5. python装饰器实现单例模式_请教Python 使用装饰器实现单例模式的原理

    1 简单来讲,可以不严谨地把Python的装饰器看做一个包装函数的函数. 比如,有一个函数: def func(): print 'func() run.' if '__main__' == __na ...

  6. python 类装饰器和继承_python装饰器、继承、元类、mixin,四种給类动态添加类属性和方法的方式(一)...

    介绍装饰器.继承.元类.mixin,四种給类动态添加类属性和方法的方式 有时候需要給类添加额外的东西,有些东西很频繁,每个类都需要,如果不想反复的复制粘贴到每个类,可以动态添加. 1 #coding= ...

  7. Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)

    属性取值和赋值过程 一切皆是对象,类型也是对象. 对象包含一个__class__属性指向其所属类型. 对象包含一个__dict__属性指向其所包含的成员(属性和方法). 取值过程(下面是伪代码) 1 ...

  8. python装饰器-Python——装饰器(Decorator)

    1.什么是装饰器? 装饰器放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起.在我们调用这个函数的时候,第一件事并不是执行这个函数,而是将这个函数做为参数传入它头顶 ...

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

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

最新文章

  1. 升讯威微信营销系统开发实践:(3)功能介绍与此项目推广过程的一些体会( 完整开源于 Github)...
  2. java让服务器停止运行,java调用远程服务器的shell脚本以及停止的方法实现
  3. 大型科技公司架构:中台模式的爱与恨
  4. Linux关机重启流程分析
  5. Java中大规模集合快速求和计算
  6. mysql 命令 utf8_Mysql 统一设置utf8字符
  7. 三人表决器_数电小实验之三人表决器
  8. 【五级流水线CPU】—— 7. 协处理器访问指令(2条)
  9. AngularJS指令范围中的#39;@#39;和#39;=#39;有什么区别?
  10. MongoDB在RHEL6.5下的安装
  11. 【数据分析与科学计算可视化】numpy 和 matplotlib库总结
  12. 树莓派控制超声波测距原理及实现
  13. 数据分析之FineReport
  14. Ubuntu 可视化图片——eog
  15. Linux系统u盘win7没驱动程序,u盘安装win7找不到设备驱动程序,教您解决u盘安装win7找不到设备驱动程序...
  16. 安装python3.8出现ModuleNotFoundError: No module named ‘_ctypes’解决办法
  17. leetcode 会员转让
  18. HGOI 20190821 慈溪一中互测
  19. 使用iso安装linux系统安装教程,史上最详细linux安装教程
  20. Google是如何提供“无缝”的街景全景图的?

热门文章

  1. [转]ubuntu下ATI/Intel双显卡切换的方法
  2. opensuse 12.1 启动脚本
  3. soap方式的远程调用示例代码
  4. Java实现ftp的上传、下载和删除
  5. android项目允许命令,android 项目 gradle 命令
  6. java1到100的数组_用java定义一个数组,长度为3: 1)循环输入数组元素值(元素值在1到100之间)...
  7. win10怎么设置开机启动项目_开机启动项怎么设置呢?禁用自启动程序
  8. 【干货】运维,你是青铜还是王者?
  9. 阿里云边缘容器服务、申通 IoT 云边端架构入选 2021 云边协同发展阶段性领先成果
  10. composer php 使用方法,Composer的基本使用方法