zoukankan      html  css  js  c++  java
  • Python 初始—(装饰器)

    本质上也是函数的另一种表现形式,为其它函数丰富其功能,装饰其他函数,附加功能

    在不改变被装饰的函数的源代码,而且不改变被装饰的函数的调用方式,因此被装饰的函数感知不到装饰器函数的存在

    分解装饰器

    • 函数即变量
    • 高阶函数
    • 嵌套函数

    函數从上往下依次执行,函数会在内存中创建,当函数未创建,当引用时,在内存中找不到,会出错!!

    其中这个函数被引用时,则也是引用这个函数在内存中的空间,于是会出现引用计数

    高阶函数

         把一个函数当成实参传给另一个函数(在不改变被修饰函数的源代码的情况下为被装饰的函数添加新的功能)

         返回值中包含函数名,可以对返回值中的函数的内存地址进行引用进一步对被修饰的函数进行装饰(同时也是不改变被装饰的函数代码的情况下)

     嵌套函数

    函数即变量,在函数内中定义一个函数,用def去声明一个函数,嵌套函数的作用域只能在函数内,相当于函数内的局部变量

    下面实现一个用装饰器模拟的一个网站安全认证的小例如下:

     1 user, passwd = 'jim', '123456'
     2 
     3 
     4 def auth(auth_type):
     5     def dif_auth(func):
     6         def wrapper(*args, **kwargs):
     7             if auth_type == "local":
     8                 user_name = input("请输入用户名").strip()
     9                 pwd = input("请输入密码").strip()
    10                 if user_name == user and pwd == passwd:
    11                     print("33[32;1m登录成功 33[0m")
    12                     return func(*args, **kwargs)  # 返回值
    13                 else:
    14                     exit("33[31;1m用户名 or 密码输入有误 33[0m")
    15             elif auth_type == "internet":
    16                 pass
    17 
    18         return wrapper;
    19 
    20     return dif_auth
    21 
    22 
    23 @auth(auth_type="local")
    24 def index():
    25     print("这是网站主页")
    26 
    27 
    28 @auth(auth_type="internet")
    29 def detail():
    30     print("网站详情页")
    31 
    32 index()
    33 detail()
  • 相关阅读:
    LeetCode OJ 112. Path Sum
    LeetCode OJ 226. Invert Binary Tree
    LeetCode OJ 100. Same Tree
    LeetCode OJ 104. Maximum Depth of Binary Tree
    LeetCode OJ 111. Minimum Depth of Binary Tree
    LeetCode OJ 110. Balanced Binary Tree
    apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
    JMeter入门教程
    CentOS6(CentOS7)设置静态IP 并且 能够上网
    分享好文:分享我在阿里8年,是如何一步一步走向架构师的
  • 原文地址:https://www.cnblogs.com/fuGuy/p/7954679.html
Copyright © 2011-2022 走看看