zoukankan      html  css  js  c++  java
  • 闭包跟装饰器

    闭包的概念:一个完整的闭包必须满足以下三个条件:
      1.函数中嵌套一个函数
      2.外层函数返回内层函数的变量名
      3.内层函数对外部作用域有一个非全局的变量进行引用

    例子:不带参数的闭包
    def func():
    num = 100
    def count_book():
    print("一共有{}本书".format(num))
    return count_book

    例子:带参数的闭包
    def func(num):
    def count_book():
    print("一共有{}本书".format(num))
    return count_book

    res = func(100)
    print(res.__closure__)

    闭包的作用:实现数据的锁定,提高稳定性,把数据锁定在__closure__属性里面,__closure__属性外部的全局
    变量不会进行锁定

    装饰器

    开放封闭原则:软件实体应该是可扩展,而不可修改的。也就是说说,对扩展是开放的,
    而对修改是封闭的。

    装饰器的作用:在不更改原功能函数内部代码,并且不改变调用方法的情况下为原函数添加新的功能

    装饰器的应用场景:
      1.登录验证
      2.函数运行时间统计
      3.执行函数之前准备工作
      4.执行函数后清理功能

    例子:

    def login(func):
    def fun():
    user = input("请输入账号:")
    password = input("请输入密码:")
    if username == user and pwd == password:
    func()
    else:
    print("账号密码错误")
    return fun


    @login
    def index():
    print("这是一个网站的首页")

    index()


    例子2:带参数的装饰器

    def count_num(num):
    def fun(a,b):
    print("减法",a-b)
    print("除法",a/b)
    print("乘法",a*b)
    num(a,b)
    return fun


    @count_num
    def add_num(a,b):
    print("相加",a+b)

    add_num(2,2)


    例子3:通用装饰器

    def tong_yong(func):
    def num(*args, **kwargs):
    func(*args, **kwargs)

    return num


    例子4 :类装饰器

    def tong_yong(func):
    def num(*args, **kwargs):
    print("测试类装饰器")
    return func(*args, **kwargs)

    return num


    @tong_yong
    class Cat:
    def __init__(self):
    pass
    c = Cat()
    print(c)

    注意:类装饰器跟函数装饰器的唯一不同点就是,在装饰器的内层函数要加 retun 返回值


    例子5:带参数的类装饰器

    def tong_yong(func):
    def num(*args, **kwargs):
    print("测试类装饰器")
    return func(*args, **kwargs)

    return num


    @tong_yong
    class Cat:
    def __init__(self, name, age):
    self.name = name
    self.age = age

    c = Cat("波斯猫",24)
    print(c.name)

  • 相关阅读:
    题解 DTOJ #1438. 矮人排队(lineup)
    题解 DTOJ #4423. 「THUSC2019」塔
    题解 DTOJ #4123.「2019冬令营提高组」全连
    题解 DTOJ #4016.辉夜的夜空明珠(moon)
    题解 DTOJ #2498.大步小步(babystep)
    题解 DTOJ #3326.组队(group)
    题解 DTOJ #1515.三塔合一
    题解 DTOJ #2305.Bazarek
    【code】Splay 模板
    寻找乱序数组中第K大的数
  • 原文地址:https://www.cnblogs.com/666666pingzi/p/10865508.html
Copyright © 2011-2022 走看看