zoukankan      html  css  js  c++  java
  • python——函数之装饰器

    1 问题

      实际生活中,我们很难一次性就把一个函数代码写得完美无缺。当我们需要对以前的函数添加新功能时,我们应该怎么做?

    2 问题解决思路

       (1)可以直接修改原来的函数,在函数内直接修改。当我们对多个函数都新增这个功能时,这样修改显得代码冗余。

      (2)采用装饰器来解决。装饰器是python里面的一种特殊函数(装饰其它函数),它可以在函数名以及函数体不改变的前提下,给一个函数附加一些额外代码。

    3 简单装饰器案例(python3.x)

      3.1 原代码功能:根据你输入的内容,输出你输入的城市名称。原代码如下。

     1 def bj():
     2     print("北京!")
     3 
     4 def sz():
     5     print("深圳!")
     6 
     7 def sh():
     8     print("上海!")
     9 
    10 # 功能逻辑
    11 chioce = input("请输入你喜欢的城市名称:")
    12 
    13 if chioce == "北京":
    14     bj()
    15 elif chioce == "深圳":
    16     sz()
    17 else:
    18     sh()
      上面代码执行后结果为:
        

      
    3.2 现在要添加新功能:在原来的输出城市名称前先输出"你好:"。

      3.3 解决方案1:直接在原来的函数里面添加输出“你好”相应代码。修改后的代码如下:
     1 def bj():
     2     print("你好:北京!")
     3 
     4 def sz():
     5     print("你好:深圳!")
     6 
     7 def sh():
     8     print("你好:上海!")
     9 
    10 # 功能逻辑
    11 chioce = input("请输入你喜欢的城市名称:")
    12 
    13 if chioce == "北京":
    14     bj()
    15 elif chioce == "深圳":
    16     sz()
    17 else:
    18     sh()

        上面代码执行后结果为:

        

       3.3 解决方案2:把新增功能写到一个新的函数里面,这个新的函数就是装饰器。修改后代码如下:
     1 # 装饰器函数
     2 def hello(func):
     3     def innner():
     4         print("你好:", end='')
     5         func()
     6     return innner
     7 
     8 @hello
     9 def bj():
    10     print("北京!")
    11 
    12 @hello
    13 def sz():
    14     print("深圳!")
    15 
    16 @hello
    17 def sh():
    18     print("上海!")
    19 
    20 # 功能逻辑
    21 chioce = input("请输入你喜欢的城市名称:")
    22 
    23 if chioce == "北京":
    24     bj()
    25 elif chioce == "深圳":
    26     sz()
    27 else:
    28     sh()

         上面代码执行后结果为:

         

    4 复杂装饰器案例(python3.x)   

        4.1 代码功能:根据选择进入不同区域,如图片区域或音乐区域。原代码如下,

     1 def ftp():
     2     print("这里是图片区")
     3 
     4 def fyy():
     5     print("这里是音乐区")
     6     
     7 
     8 # 功能代码
     9 ychoice = input("请输如的你的选择:")
    10 
    11 if ychoice == "1":
    12     ftp()
    13 elif ychoice == "2":
    14     fyy()
    15 else:
    16     print("输入错误:请输入1或2!")
      上面代码执行后结果为:
        
    4.2 需要新增的功能:根据不同情况,在输出时首先输出"---------------------------"或者"****************************"的分隔符。

    4.3 使用装饰器来增加这个新功能,修改后的代码如下,
     1 def login(char):
     2     def checkin(func):
     3         def inner():
     4             print(char * 50)
     5             func()
     6         return inner
     7     return checkin
     8 
     9 @login("*")
    10 def ftp():
    11     print("这里是图片区")
    12 
    13 @login("-")
    14 def fyy():
    15     print("这里是音乐区")
    16 
    17 # 逻辑功能
    18 ychoice = input('''请输如的你的选择:''')
    19 
    20 if ychoice == "1":
    21     ftp()
    22 elif ychoice == "2":
    23     fyy()
    24 else:
    25     print("输入错误:请输入'1'或者'2'!")
      上面代码执行后结果为:
        
    2018-08-12
      
     
          

        

      

      

  • 相关阅读:
    opencv ImportError: libSM.so.6: cannot open shared object file: No such file or directory
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcd
    Linux卸载并更新显卡驱动
    人脸识别
    dav转mp4
    python调用c++接口,参数为opencv读取数据
    Linux下内存泄漏工具valgrind
    模型轻量化
    自动驾驶车搭建
    TSN(Temporal Segment Networks)
  • 原文地址:https://www.cnblogs.com/cuizhu/p/9463333.html
Copyright © 2011-2022 走看看