• python之装饰器的进阶


    一、带参数的装饰器 (必须会)

    针对不同的app的验证,比如:天猫和天猫超市,京东商城和京东超市

    def wrapper_out(n):
    	print(n)
    	def wrapper(f):
    		def inner(*args,**kwargs):
    			if n == '腾讯':
    				user_input = input('请输入用户名: ').strip()
    				pass_input = input('请输入密码: ').strip()
    				with open('qq.txt',mode='r+',encoding='utf-8') as f1:
    					for i in f1:
    						username,password = i.strip().split('|')
    						if username == user_input and password == pass_input:
    							print('登录成功')
    							ret = f(*args,**kwargs)
    							return ret
    					return False
    			elif n == '抖音':
    				user_input = input('请输入用户名: ').strip()
    				pass_input = input('请输入密码: ').strip()
    				with open('dy.txt',mode='r+',encoding='utf-8') as f2:
    					for j in f2:
    						username, password = j.strip().split('|')
    						if username == user_input and password == pass_input:
    							print('登录成功')
    							ret = f(*args, **kwargs)
    							return ret
    					return False
    		return inner
    	return wrapper
    
    @wrapper_out('腾讯')
    def qq():
    	print('成功访问qq')
    qq()
    
    @wrapper_out('抖音')
    def tiktok():
    	print('成功访问抖音')
    tiktok()
    

    函数一般嵌套3层

    def wrapper_out(n):
      def wrapper(f):
        def inner(*args,**kwargs):
          with open(n,encoding = 'utf-8') as f1:
            for line in f1:
              user,pass = line.strip().split('|')
          username = input('请输入用户名: ').strip()
          password = input('请输入密码: ').strip()
    			if username == user and passwor == pass:
          		dic_status['status'] = True
          ret = f(*args,**kwargs)
    			return ret
        	
    

    看到带参数的装饰器分两步执行:

    1.执行warpper_out('腾讯')这个函数,把相应的参数'腾讯'传给n,并且得到返回值warpper
    2.与@warpper结合,得到我们之前熟悉的标准版的装饰器按照装饰器流程执行
    

    练习题

    # 如果输入的是抖音的账号和密码就访问抖音,如果输入的是腾讯的用户名和密码就访问腾讯
    
    def wrapper_out(n):
    	print(n)
    	def wrapper(f):
    		def inner(*args,**kwargs):
    			if n == '腾讯':
    				user_input = input('请输入用户名: ').strip()
    				pass_input = input('请输入密码: ').strip()
    				with open('qq.txt',mode='r+',encoding='utf-8') as f1:
    					for i in f1:
    						username,password = i.strip().split('|')
    						if username == user_input and password == pass_input:
    							print('登录成功')
    							ret = f(*args,**kwargs)
    							return ret
    					return False
    			elif n == '抖音':
    				user_input = input('请输入用户名: ').strip()
    				pass_input = input('请输入密码: ').strip()
    				with open('dy.txt',mode='r+',encoding='utf-8') as f2:
    					for j in f2:
    						username, password = j.strip().split('|')
    						if username == user_input and password == pass_input:
    							print('登录成功')
    							ret = f(*args, **kwargs)
    							return ret
    					return False
    		return inner
    	return wrapper
    
    @wrapper_out('腾讯')
    def qq():
    	print('成功访问qq')
    qq()
    
    @wrapper_out('抖音')
    def tiktok():
    	print('成功访问抖音')
    tiktok()
    
    

    增强耦合性写法

    def wrapper_out(n):
    	def wrapper(f):
    		def inner(*args,**kwargs):
    				user_input = input('请输入用户名: ').strip()
    				pass_input = input('请输入密码: ').strip()
    				with open(n,mode='r',encoding='utf-8') as f1:
    					for i in f1:
    						username,password = i.strip().split('|')
    						if username == user_input and password == pass_input:
    							print('登录成功')
    							ret = f(*args,**kwargs)
    							return ret
    						else:
    							print('验证失败')
    					return False
    		return inner
    	return wrapper
    
    @wrapper_out('qq')
    def qq():
    	print('成功访问qq')
    qq()
    
    @wrapper_out('dy')
    def tiktok():
    	print('成功访问抖音')
    tiktok()
    

    二、多个装饰器装饰一个函数 (流程会)

    def wrapper1(func1):  # func1 = f原函数
        def inner1():
            print('wrapper1 ,before func')  # 2
            func1()
            print('wrapper1 ,after func')  # 4
        return inner1
    
    def wrapper2(func2):  # func2 == inner1
        def inner2():
            print('wrapper2 ,before func')  # 1
            func2()  # inner1
            print('wrapper2 ,after func')  # 5
        return inner2
    
    
    @wrapper2  # f = wrapper2(f) 里面的f == inner1  外面的f == inner2
    @wrapper1  # f = wrapper1(f) 里面的f == func1  外面的 f == inner1
    def f():
        print('in f')  # 3
    
    f()  # inner2()
    
    # 输出结果
    wrapper2 ,before func
    wrapper1 ,before func
    in f
    wrapper1 ,after func
    wrapper2 ,after func
    

    三、递归函数 (练习题,作业题会做*)

    递归就是自己用自己

    官网规定: 默认递归的最大深度1000次

    如果你递归超过100次还没有解决这个问题,那么执意使用递归,效率很低

    形式

    def func(n):
    	print(n)
    	n += 1
    	func(n)
    func(1)
    

    练习题

    # 查看电脑执行次数
    import sys
    print(sys.setrecursionlimit(1000000))
    def func(n):
    	print(n)
    	n += 1
    	func(n)
    func(1)
    
    def age(n):
    	if n == 1:
    		return 18
    	else:
    		return age(n-1) + 2
    print(age(4))
    # 输出结果
    24
    
    #
    l1 = [1, 3, 5, ['太白','元宝', 34, [33, 55, [11,33]]], [77, 88],66]
    def func(n):
    	for i in n:
    		if type(i) == list:
    			func(i)
    		else:
    			print(i)
    func(l1)
    # 输出结果
    1
    3
    5
    太白
    元宝
    34
    33
    55
    11
    33
    77
    88
    66
    
  • 相关阅读:
    Eclipse 安装配置指南
    CentOS下安装Git
    MySQL5.5在Windows下的安装
    NSInvocation调用
    动态调用
    模拟静态变量及静态类继承
    respondsToSelector判断是否实现了某方法
    JAVA闭包
    IMP获取函数指针
    [链表] 对链表与文件的结合使用的一点看法
  • 原文地址:https://www.cnblogs.com/zanao/p/11099493.html
Copyright © 2020-2023  润新知