Python3装饰器

6人阅读 评论(0) 收藏 举报
分类:

装饰器

    定义:本质是函数,装饰其他函数(就是为其他函数添加附加功能)

    原则:1、不能修改被装饰的函数的源代码

              2、不能修改被装饰的函数的调用方式

实现装饰器的知识储备:1、函数即“变量” 2、高阶函数 3、嵌套函数(在一个函数体内用def去申明一个新函数)

高阶函数+嵌套函数--》装饰器


内存回收机制:变量与函数的内存回收机制是一样的

实例1如下:

def timer(func):
    def deco():
        func()
        print(3)
    return deco
@timer     # ---> test1 = timer(test1)
def test1():
    print(1)

@timer
def test2():
    print(2)

test1()
test2()
输出:
1
3
2
3
实例2如下:
import time

def timer(func):
    def deco():
        start_time = time.time()
        func()
        stop_time = time.time()
        print("the func tun time is %s" %(stop_time-start_time))
    return deco

def test1():
    time.sleep(1)
    print('in the test1')
def test2():
    time.sleep(1)
    print('in the test2')
    
test1 = timer(test1)
test1()
输出如下:
in the test1
the func tun time is 1.0000572204589844


进阶版装饰器(带参数)

user,passwd = 'hcl','abc123'
def auth(auth_type):
    print("auth func",auth_type)
    def outer_wrapper(func):
        def wrapper(*args,**kwargs):
            print("wrapper func args:",*args,**kwargs)
            if auth_type == "local":
                username = input("Username:").strip()
                password = input("Passwd:").strip()
                if user == username and passwd == password:
                    print("User has passed authentication")
                    res = func(*args,**kwargs)
                    print("-----arter authentication--")
                    return res
                else:
                    exit("invalid username or password")
            elif auth_type == "ldap":
                print("ldap")
        return wrapper
    return outer_wrapper

def index():
    print("welcome to index page")
    
@auth(auth_type = "local") # @auth--> home = auth(home) 与  @auth(auth_type = "local")的区别
def home():
    print("welcome to home page")
    return "from home"

@auth(auth_type = "ldap")
def bbs():
    print("welcome to bbs page")
    
index()
print(home())
bbs()

输出如下:

auth func local
auth func ldap
welcome to index page
wrapper func args:
Username:hcl
Passwd:123
invalid username or password
注意: @auth--> home = auth(home)   与    @auth(auth_type = "local")的区别
查看评论

Python3 装饰器

Python3 装饰器 装饰器: 本质是函数, 用于装饰其他函数, 附加一些本身所没有的功能...
  • Rozol
  • Rozol
  • 2017-05-04 21:58:21
  • 2249

python3学习笔记:装饰器

想理解Python的decorator首先要知道在Python中函数也是一个对象,所以你可以将函数复制给变量 将函数当做参数 返回一个函数函数在Python中给变量的用法一样也是一等公民,也就是高阶函...
  • xionghuixionghui
  • xionghuixionghui
  • 2017-03-23 13:25:48
  • 1250

Python3之实现装饰器的两种方式

M1: def wrapper(self, func): """ :return: """ def in...
  • qq_33733970
  • qq_33733970
  • 2018-03-01 17:06:25
  • 83

Python3.5——装饰器及应用详解(上)

1、装饰器: (1)本质:装饰器的本质是函数,其基本语法都是用关键字def去定义的。 (2)功能:装饰其他函数,即:为其他函数添加附加功能。 (3)原则:不能修改被装饰的函数的源代码,不能修改被装饰的...
  • loveliuzz
  • loveliuzz
  • 2017-09-05 21:15:48
  • 451

Python3学习(24)--内置装饰器@property

@property 前面我们学过装饰器,我们知道,装饰器的作用就是用来扩展函数的,当然前面我们介绍的装饰器,都是我们自己定义的,格式如下: @decoretor def func(*args,**...
  • Appleyk
  • Appleyk
  • 2017-09-05 12:40:51
  • 3718

python3.3 装饰器日志

#!/usr/local/bin/Python3.3 #-*-coding:utf-8-*- def log_none_params(func): ''' none params decorat...
  • zhang_Red
  • zhang_Red
  • 2013-06-05 13:39:56
  • 1659

Python装饰器单例

python装饰器实现单例
  • dutsoft
  • dutsoft
  • 2016-07-28 18:48:38
  • 597

python3 装饰器

装饰器 python3
  • youngbit007
  • youngbit007
  • 2017-03-23 23:29:27
  • 354

python基础之函数进阶之函数作为返回值/装饰器

因为装饰器需要用到返回函数的知识,所以在这里将返回函数和装饰器合并讲解。 什么是返回函数? 我们知道,一个函数中return可以返回一个或者多个值,但其实,return不仅可以返回值,还可...
  • zhaohongyan6
  • zhaohongyan6
  • 2017-04-28 10:30:30
  • 81

解除装饰器作用(python3新增)

一个装饰器已经作用在一个函数上,你想撤销它,直接访问原始的未包装的那个函数。假设装饰器是通过 @wraps 来实现的,那么你可以通过访问 wrapped 属性来访问原始函数:>>> @somedeco...
  • xiaodongxiexie
  • xiaodongxiexie
  • 2017-08-24 15:26:21
  • 4606
    个人资料
    等级:
    访问量: 0
    积分: 210
    排名: 0
    文章存档