多个装饰器的应用以及自我想法的验证(未完)

 1 #!usr/bin/env python   
 2 #-*- coding=utf-8 -*-
 3 def outer_2(func):
 4     def inner(*args,**kwargs):#接受所有的变量
 5         print('这是outer2装饰器')
 6         r = func(*args,**kwargs)#接受所有的变量
 7         print("这是outer2装饰器的inner中的return之前")
 8         return r
 9     return inner
10 def outer(func):#定义outer装饰器
11 
12     def inner(*args,**kwargs):#接受所有的变量
13         print('outer1装饰器')
14         r = func(*args,**kwargs)#接受所有的变量
15         print('outer1装饰器2')
16         return r#重新定义func函数
17 
18     return inner#返回inner函数
19 class index2():
20     @outer_2
21     @outer
22     def index(self,a1,a2):
23         print('很复杂')
24         self.a1 = a1
25         self.a2 = a2
26         return self.a1 + self.a2
27 
28 b  = index2()
29 c = b.index(1,2)
30 print (c)

其结果为

1 这是outer2装饰器
2 outer1装饰器
3 inner1
4 很复杂
5 inner2
6 outer1装饰器2
7 这是outer2装饰器的inner中的return之前
8 3

可不可以这么想 虽然python是由上向下的编译过程,但是他符合就近原则,先进入outer编译器定义后再进入outer_2装饰器定义?

为了验证 我准备写一个登陆程序看看到底是不是

 1 #!usr/bin/env python   
 2 #-*- coding=utf-8 -*-
 3 Mysql = {'alw':'qwer'}
 4 def id():#输入账号 返回账号值
 5     id = input("请输入您的账号")
 6     return id
 7 def pwd():#输入密码 返回密码值
 8     pwd = input("请输入您的密码")
 9     return pwd
10 def outer(func):#定义Outer装饰器进行账号密码的审核
11 
12     def inner(*args,**kwargs):#定义inner函数
13         a = id()
14         b = pwd()
15         if (
16             a in Mysql and
17             b == Mysql['alw']
18         ):#确认输入的账号密码是否存在于字典Mysql
19             r = func(*args,**kwargs)
20             print("成功!")
21         else:
22             print("Error")
23         return r
24     return inner
25 def outer_2(func):
26     def inner():
27         print('正在显示登陆界面')
28         r = func()
29         return r
30     return inner
31 @outer
32 @outer_2
33 def sum(a1,a2):
34     return a1 + a2
35 j = sum(1,2)
36 print (j)

在这里卡住了。。。提示错误:

请输入您的账号alw
请输入您的密码qwer
Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/untitled/装饰器验证.py", line 35, in <module>
    j = sum(1,2)
  File "C:/Users/Administrator/PycharmProjects/untitled/装饰器验证.py", line 19, in inner
    r = func(*args,**kwargs)
TypeError: inner() takes 0 positional arguments but 2 were given

  

posted @ 2017-12-15 10:13  双商略低的派生  阅读(134)  评论(0编辑  收藏  举报