47 单例模式 和装饰器
Posted knighterrant
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 res return 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 ret else: ret = f(*args, **kwargs) return ret return inner return wrapper flag1 = 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()
3. 多个装饰器,装饰同一个函数
#多个装饰器 装饰一个函数 def wrapper1(func): # func == f 函数名 def inner1(): print(‘wrapper1 ,before func‘) # 2 func() print(‘wrapper1 ,after func‘) # 4 return inner1 def wrapper2(func): # func == inner1 def inner2(): print(‘wrapper2 ,before func‘) # 1 func() print(‘wrapper2 ,after func‘) # 5 return 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 obj def __init__(self): print(222) obj1 = A() class A: __instance = None def __new__(cls, *args, **kwargs): if A.__instance is None: obj = object.__new__(cls) A.__instance = obj return A.__instance obj1 = A() obj2 = A() obj3 = A() obj4 = A() print(obj1) print(obj2) print(obj3) print(obj4)
以上是关于47 单例模式 和装饰器的主要内容,如果未能解决你的问题,请参考以下文章