多个装饰器的应用以及自我想法的验证(未完)
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