其实去年就开始学python了,零零散散,陆陆续续学了点,期间学习了python web开发,爬虫系统;但是一些基础性的知识点长时间不看了就会忘,所以写个博客记录下来,忘了可以随时查看,不用回去看代码了,希望也能帮助大家学习哈。
python中的装饰器decorator其实是一个高阶函数,它接受一个函数作为参数,并返回一个新的函数,它的执行是由外向内的,代码如下
#装饰器函数
def log(f):
def fn():
print (('call ') + f.__name__ + '()...')
r = f() # 这个函数就是调用的 f1()函数
return r #返回f1() 函数的执行结果
return fn
@log #1.自动执行log函数,并且将其下面的函数名f作为参数
def f1():
print('我是函数F1')
f1()
#输出结果
# call f1()...
# 我是函数F1
我们可以看到上面代码执行的是一个没有参数的函数,如果函数有参数,并且有多少个参数我们不知道,那该怎么办呢?非常好的一点是python里面提供了万能参数供我们使用,如果对 万能参数不明白的可以看我的 上一篇博客
def log2(f):
def inner(*args,**kwargs): #这2个参数 会接受任意类型的参数
print('before')
r = f(*args,**kwargs)
print('after')
return r
return inner
@log2
def f2(name,age):
print('My name is %s ,I am %s years old'%(name,age))
f2('Eric',24)
#输出
# before
# My name is Eric ,I am 24 years old
# after
比方说一所中学有一个夏令营的活动,夏令营有各种活动,但是每个活动对学生的要求不一样,有的活动要求学生必须满18岁,有的活动要求学生必须考试分数及格(60),还有的活动必须要求学生2个都满足,每个活动都可以写成一个函数,如果这些要求条件我们都写成装饰器的话,就有点太冗余了,还好就是可以多重装饰,简单说就是一个函数可以有多个装饰器,代码如下
USER_INFO = {'age':0,'score':0} # 用户分数 #用户年龄
def check_age(f):
def inner(*args,**kwargs):
#检查年龄 是否满18
if USER_INFO.get('age',None) >= 18:
r = f(*args,**kwargs) #年龄符合 调用方法
return r
else:
print('你还未成年,一边待着去......')
return inner
def check_score(f):
def inner(*args, **kwargs):
#检查分数是否合格 60份合格
if USER_INFO.get('score',None) >= 60:
r = f(*args, **kwargs)
return r
else:
print('你考试不合格,继续努力......')
return inner
# 2个装饰器修饰 会先执行判断年龄的装饰器,在执行判断分数的装饰器
@check_age
@check_score
def swimming():
print('欢迎来游泳'.center(40, '*'))
@check_age
def basketball():
print('欢迎来篮球队玩耍'.center(40,'*'))
@check_score
def football():
print('欢迎来足球队飞'.center(40, '*'))
'''
1.篮球不需要分数,但是要年龄满18岁
2.足球不需要年龄,但要分数满60
3.游泳急需要年龄满18 有需要分数满60
'''
def main():
while True:
imp = input('1.篮球,2.足球,3.游泳\n>>>')
age = input('请输入你的年龄:')
score = input('请输入你的分数:')
USER_INFO['age'] = int(age)
USER_INFO['score'] = int(score)
if imp == '1':
basketball()
elif imp == '2':
football()
elif imp == '3':
swimming()
if __name__ == '__main__':
main()