zoukankan      html  css  js  c++  java
  • python中的装饰器

    装饰器:

      在不改变元代码和调用方式的基础上增加新功能
    函数中
      内存地址 +():表示调用该函数

    eg:
    def test():
      print("==>")
    print(test)
    # test表示函数test()的内存地址

    # wrapper 包装、包裹;decorator 装饰器、装饰

    装饰器一般格式:

    def 	wrapper(func):    
    	def 	deco():
    			func()
    	return deco 
    	      
    @wrapper      
    def index():
    	print("欢迎来到我的世界!")
    index()

    如何实现装饰器?
    一、没有形参

    def	wrapper(func):		#wrapper的执行结果是:返回deco的内存地址
    	def	deco():
    		func()
    		print("add  new  function")
    	return	deco		#return返回的是deco的内存地址
    	
    def	index():
    	print("欢迎来到我的世界!")
    	
    #result=wrapper(index)
    #result()
    index=wrapper(index)     #index=deco
    index()                  #index()=deco()
    
    >>> 欢迎来到我的世界!
    >>> add  new  function

    二、源代码有形参

    1、

    def	 wrapper(func):    #wrapper的执行结果是:返回deco的内存地址
    	def 	deco(user,passwd):
    		 func(user,passwd)
    		 print("add new function")
    	 return deco       #return返回的是deco的内存地址
    
    def 	index(user,passwd):
    	print("欢迎来到我的世界!")
    
    index = wrapper(index)                  #index=deco
    index('root','root')                    #index()=deco()
    
    >>> 欢迎来到我的世界!
    >>> add  new  function

    2、

    def	 wrapper(func):    #wrapper的执行结果是:返回deco的内存地址
    	def 	deco(*args,**kwargs):
    		 func(*args,**kwargs)
    		 print("add new function")
    	 return deco       #return返回的是deco的内存地址
    
    def 	index(*args,**kwargs):
    	print("欢迎来到我的世界!")
    
    index = wrapper(index)                  #index=deco
    index('root','root')                    #index()=deco()
    
    >>> 欢迎来到我的世界!
    >>> add  new  function

    三、装饰器有形参(在外边再加一个函数)

    def	default(engine):
    	def	wrapper(func):
    		def	deco():
    			my_engine = input('myengine:')
    			if	engine == my_engine:
    				user = input("username:")
    				pwd = input("password:")
    				if user == 'root' and pwd == 'root':
    					func()
    				else:
    					print("用户名密码错误!")
    			elif engine == 'myism':
    				print("this is myism engine")
    			else:
    				print("不属于mariadb引擎")
    		return deco
    	return wrapper
    
    @default('innodb')
    def index():
    	print("欢迎来到我的世界!")
    index
    
    >>> myengine:innodb
    >>> username:root
    >>> password:root
    >>> 欢迎来到我的世界!

    实例:
    #在访问之前加一层验证:

    def 	wrapper(func):    
    	def 	deco():
    		user = input("username:")
    		pwd = input("password:")
    		if user == 'root' and pwd == 'root':
    			func()
    		else:
    			print("用户名密码错误!")
    	return deco       
    @wrapper      #官方指定装饰器语法。index = wrapper(index)
    def index():
    	print("欢迎来到我的世界!")
    index()
    
    >>> username:root
    >>> password:root
    >>> 欢迎来到我的世界!
    >>> username:root
    >>> password:qwer
    >>> 用户名密码错误!
    作者:无荨

    -------------------------------------------

    个性签名:学IT,就要做到‘活到老学到老’!

    如果觉得这篇文章对你有小小的帮助的话,别忘记点个“推荐”哦!

  • 相关阅读:
    494. Target Sum 添加标点符号求和
    636. Exclusive Time of Functions 进程的执行时间
    714. Best Time to Buy and Sell Stock with Transaction Fee有交易费的买卖股票
    377. Combination Sum IV 返回符合目标和的组数
    325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组
    275. H-Index II 递增排序后的论文引用量
    274. H-Index论文引用量
    RabbitMQ学习之HelloWorld(1)
    java之struts2的数据处理
    java之struts2的action的创建方式
  • 原文地址:https://www.cnblogs.com/twoo/p/11661765.html
Copyright © 2011-2022 走看看