装饰器与命名空间

装饰器:

我们可以直接修改我们以前相类似的函数代码去完成我们所需要的新功能,但是会产生一些问题:
1.如果修改的地方比较多,则修改起来比较麻烦
2.不利于后续维护
3.违反了编写代码的开闭原则(OCP,O:open,C:close,P:principle)
就是在对程序进行拓展时,不能对程序进行修改(在不改变源代码的情况下,对程序进行功能上的添加)
通过装饰器,就可以在不改变源代码的情况下,引入新的功能

def s(a,b):
    print(a,'+',b,'=',a+b)
# s(10,20)
def m(a,b):
    print(a,'*',b,'=',a*b)
# m(11,22)
def new(n,a,b):
    print('开始计算')
    r = n(a,b)
    print('计算结束')
    return r
p = new(m,11,22)

自定义函数s与m我们可以看出来分别是计算两个数相加与相减,通过自定义一个新的函数我们可以在调用这两个函数时再打印上计算开始与计算结束

def s(a,b):
    print(a,'+',b,'=',a+b)
# s(10,20)
def m(a,b):
    print(a,'*',b,'=',a*b)
# m(11,22)
#fun:调用的或者旧的函数
def a(fun):
    def e(a,b):
        print("计算开始")
        r = fun(a,b)
        print("计算结束")
        return r
    return e
z = a(m)
s = z(1,2)

我们在设置函数时可以将形参设置为*a,**b,便于接收各种实参
在开发中,对程序的扩展都是通过装饰器进行的

命名空间

命名空间:专门用来保存变量的字典
使用locals()来获取当前函数作用域的命名空间,有返回值,返回一个字典
在这里插入图片描述可以使用locals()向命名空间中添加键值对,相当于在全局中创建了一个变量

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51864831/article/details/109845794