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 单例模式 和装饰器的主要内容,如果未能解决你的问题,请参考以下文章

Python中的单例模式——装饰器实现剖析

Python如何实现单例模式

装饰器实现单例模式

设计模式---(简单工厂模式,工厂模式,抽象工程模式),单例模式,代理模式,装饰器

5.19Java装饰器设计模式

单例模式