装饰器

  • 什么是装饰器

    装饰器指的是为被装饰对象添加新功能的工具

    装饰器本身可以是任意可调用对象

    被装饰对象本身也可以是任意可调用对象

  • 为什么要用装饰器

    开放封闭原则:对修改封闭,对扩展开放

    装饰器的实现原则:

    1. 不能修改被装饰对象的源代码

    2. 不能修改被装饰对象的调用方式

    装饰器的目的:

    就是在遵循原则1和原则2的原则的条件的情况下实现为被装饰对象添加新功能。

  • 怎么用装饰器

    # 装饰器的基本框架
    def outer(func):
        def wrapper(*args, **kwargs):  # 设置可变形参可以接收任意值
            # 此处可以添加装饰内容(添加新功能)
            res = func(*args, **kwargs)
            # 此处可以添加装饰内容(添加新功能),即被装饰对象前后皆可添加功能语句
            return res  # 返回被装饰对象的值,保证与被装饰对象功能的一致性
        return wrapper
        
        
    @outer  # 语法糖,本质上是将outer(func1)的内存地址绑定给新的func1,func1 = outer(func1)
    def func1():
        pass
            
            
    func()  # 调用函数,此时的函数就是被装饰过的函数

    语法糖:在被装饰对象正上方加入@装饰器名称

  • 装饰器使用实例

    1. 实例1

# 实现在被装饰对象基础上添加计时功能
import time
​
def timer(func):
    def wrapper(*args, **kwargs):
        t1 = time.time()  # 记录被装饰对象执行前时间
        res = func(*args, **kwargs)
        t2 = time.time()  # 被装饰对象执行完时间
        print(t2 - t1)
        return res
    return wrapper
    
    
@timer
def welcome():
    time.sleep(2)
    print('welcome to China')
    
    
welcome()
  1. 实例2

# 给被装饰对象添加登录认证功能
def login(func):
    def wrapper(*args, **kwargs):
        while True:
            name = input("input your name:").strip()
            pwd = input("input your password:").strip()
            if name == 'Jason' and pwd == '123':
                res = func(*args, **kwargs)
                return res
            else:
                print("name or password error!")
    return wrapper          
​
@login
def welcome(name):
    print("welcome %s to China !" % name)
    
​
welcome('Jason')
 

 

转载于:https://www.cnblogs.com/liusijun113/p/10041927.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐