zoukankan      html  css  js  c++  java
  • python之路----装饰器

    装饰器原理

    1.1什么是装饰器:装饰器是由函数去生成的,用于装饰某个函数或方法或类,他可以让这个函数在执行之前或者执行之后做一些操作

    实际例子:

    先定义一个函数 func

    def func(arg):

      print(arg)

    func('hello  world')

    *************执行结果为打印 hello world***************

    现在在执行func 函数前后执行一些操作,就可以建立一个装饰器来实现:

    PS:(这可是一个完美的装饰器),背下来  以后用就往里套就可以了

    def decorator(func):#创建 一个装饰器函数,接受的参数arg参数就是func函数名
        def inner(*args,**kwargs):
            print('执行函数之前要添加的函数')
            ret=func(*args,**kwargs)
            return ret
         return ret
    
    @decorator#语法糖 如果 要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名
    def func(arg):
        print(arg):
    fucn('hello world')装饰装饰千
    装饰器函数

    装饰之后输出结果为:

      执行函数之前加的代码

        hello world

      执行函数之后加的代码

    **********************

    这就是一个能hold住所有函数传参的装饰器

    开放封闭原则

    1.2对扩展是开放的,我们允许 代码的扩展和添加新的功能

    1.3对修改是封闭的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

    扩展项:多个装饰器装饰同一个函数

    def wrapper1(func):
        def inner():
            print('wrapper1 ,before func')
            func()
            print('wrapper1 ,after func')
        return inner
    
    def wrapper2(func):
        def inner():
            print('wrapper2 ,before func')
            func()
            print('wrapper2 ,after func')
        return inner
    
    @wrapper2
    @wrapper1
    def f():
        print('in f')
    
    f()
    
    多个装饰器装饰同一个函数
    多个装饰器

    扩展项:带开关的装饰器

    你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?

    def outer(flag):
        def timer(func):
            def inner(*args,**kwargs):
                if flag:
                    print('''执行函数之前要做的''')
                re = func(*args,**kwargs)
                if flag:
                    print('''执行函数之后要做的''')
                return re
            return inner
        return timer
    
    @outer(False)
    def func():
        print(111)
    
    func()
    
    带参数的装饰器开关
    开关
  • 相关阅读:
    todo-list
    codeforces 794 (#414 DIV1+DIV2)
    2018bnu校赛总结
    codeforces 743D
    HDU-2196 Computer (树形DP)
    HDU- 1005 Number Sequence(矩阵快速幂)
    HDU- 4000 Fruit Ninja(树状数组)
    codeforces 505C
    codeforces 286B
    codeforces 3D
  • 原文地址:https://www.cnblogs.com/zgd1234/p/7463861.html
Copyright © 2011-2022 走看看