数据库基础学习:
1. 闭包的功能及其使用的条件:
# 定义一个外部函数
def fun_out(num1):
def fun_inner(num2):
result=num1+num2;
print("结果是",result);
# 外部函数返回了内部函数,在这里返回的内部函数就是闭包
return fun_inner;
# 创建闭包的实例,就是相当于可以去使用外部函数的变量,此时f就是相当于闭包
f=fun_out(1);
f(2);
f(3);
# 在闭包内需要修改函数的变量的值,在此处需要使用关键字nolocal关键字
- 装饰器的知识点:
装饰器的定义:
1.不修改已有函数的源代码
2.不修改已有函数的调用方式
3.给已有函数增加额外的功能
# 对已有函数对于额外的功能的扩展,装饰器实际上是一个闭包的函数,也就是一个函数的嵌套
# 定义装饰器
def decorator(func): # 如果闭包函数参数有且只有一个并且是函数类型,那么这个闭包函数称之为装饰器
def inner():
# 在内部函数里面堆已有函数进行装饰
print("已添加登录的验证");
func();
return inner;
# 使用语法糖的格式进行书写装饰器,使用的格式就是@ 装饰器的名称
@ decorator
def comment():
# 添加登录的判定
# print("已添加登录的验证");
print("发表评论");
# 调用装饰器对我们已有的函数进行装饰
# comment=decorator(comment);
# 在此处并不是简单的函数的调用,二十上面的变量的名称
comment();
# 装饰器的执行的时机。当当前的模块加载完成之后,装饰器立即执行,对已有的函数进行装饰
通用的装饰器的写法
ef decorator(func):
# 使用函数装饰器的时候,内部函数的类型和要装饰的函数的类型要保持一致
def inner(*args,**kwargs):
print("正在执行加法运算");
# *args把元组中的每一个数据,按照位置参数的形式进行传递
# **kwargs把字典里的每一个键值对,按照关键字的形式的方式进行传递
# 这里对元组和字典进行拆包,仅限于结合不定长参数的函数使用
num=func(*args,**kwargs);
return num;
return inner;
将带有参数的装饰器封装到函数之后,在进行调用函数,让函数进行参数的传递,因为在装饰器中参数只能是函数的形式,不能带有其他的形式的函数
# 进行区分不同的函数执行 不同的代码
# 装饰器只能接受一个参数,并且只能是函数的类型,所以在此处直接的进行引入不合适,可以封装到函数之中、
def return_decorator(flag):
def decorator(func):
def inner(a,b):
if flag=="+":
print("正在执行加法运算");
elif flag=="-":
print("正在执行减法运算");
func(a,b);
return inner;
# 当调用函数的时候可以返回一个装饰器,并且返回的是decorator装饰器
return decorator;
# 减法运算
@return_decorator("+")
def add_num(a,b):
result=a+b;
print(result);
add_num(1,2);
# 减法计算
@return_decorator("-")
def sub_num(a,b):
result=a-b;
print(result);
sub_num(4,2);
使用类装饰器:
主要是看如何的进行初始化及其,如何保证数据是否可以被调用,因为在我们的函数的内部实现了调用了call方法
# 类装饰器:使用类装饰已有的函数
class MyDecorator(object):
# 初始化的功能在此处执行。
def __init__(self,func):
self.func=func;
# 实现 __call__(self, *args, **kwargs),让对象变成可以调用的对象的类型
def __call__(self, *args, **kwargs):
# 对已有函数进行封装
print("课程已经讲解完成");
self.func();
@MyDecorator
def show():
print("快要放学了");
show();