python第十一天

开始第二模块的学习:

装饰器 :

描述:

装饰器原则:

  1、不能修改被装饰的函数的源代码

  2、不能修改装饰的函数的调用方试

 

实现装饰器的需要:

  高阶函数+嵌套函数=装饰器

  高阶函数:

      类型I:将函数做为实参的函数,可以称为高阶函数

        

1 def fun_1(fun_2):#fun_1 为高阶函数
2     print('1')
3     fun_2()
4 
5 def fun_2():
6     print('2')
7 
8 fun_1(fun_2)

 

      类型II:返回值中包含函数名的函数,也可以称为高阶函数

      

def fun_3(fun):#fun_3 为高阶函数
    print('3')
    return fun

def fun_4():
    print('4')

#fun_3(fun_4)()#返回值可以直接运行
fun=fun_3(fun_4)#可以将返回值赋于一个变量
fun()#可以调用函数

 

  嵌套函数:

      在函数中定义一个新函数,这个函数称为嵌套函数

    

1 def fun_5():#fun_5 为嵌套函数
2     print('5')
3     def fun_5_1():
4         print('5.1')
5     
6 fun_5()

最简单的装饰:

 1 def fun_2(fun):#传入fun_1的函数
 2     def function():
 3     
 4         fun()
 5         print('in the fun_2......')#增加新的内容
 6     
 7     return function
 8 
 9 @fun_2#装饰fun_!  相当于fun_1=fun_2(fun_1)
10 def fun_1():
11     print("in the fun_1....")
12 
13 
14 fun_1()

装饰器: 模拟登陆认证

 1 #模拟网站登陆访问认证
 2 #
 3 name='abc'
 4 password='123'
 5 def certi(model):#装饰器
 6     def outr(fun):#装饰器加参数需要多加一层嵌套
 7         def login(*args,**kwargs):#为了兼容各类函数参数,添加 *args,**kwargs 不固定参数
 8             if model=='password':
 9                 print('这是password认证')
10                 user_name = input('用户名:').strip()
11                 paswd=input('密码:').strip()
12                 if user_name==name and paswd==password:    
13                     print('通过认证')
14                     return fun(*args,**kwargs)
15                 else:
16                     print('用户或密码错误 ,退出')
17                     exit()
18             elif model=='lamp':
19                 print('这是lamp认证')
20                 return fun(*args,**kwargs)
21             else:
22                 print('认证出错')
23         return login
24     return outr
25 
26 
27 def indxe():
28     print('欢迎进入首页')
29 
30 @certi(model='password')
31 def user():
32     print('欢迎进入用户页面:')
33 
34 @certi(model='lamp')
35 def bbs(name):
36     print('欢迎%s登陆论坛!!'%name)
37 
38 indxe()
39 user()
40 bbs(name='yjj')

 

  

posted @ 2017-05-13 23:30  莫柔落切  阅读(383)  评论(1编辑  收藏  举报