python之路-11-装饰器

11.1装饰器的基本概念

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

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

  1. 不能修改被装饰的函数的调用方式

总结:装饰器对被装饰的函数是完全透明的(被装饰的函数不知道装饰器的存在,而装饰器可装饰函数来实现所需功能)

实现装饰器知识储备:

  1. 函数即“变量”
  2. 高阶函数
  3. 把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码的情况下为其添加)
  4. 返回值中包含函数名(不修改函数的调用方式)
  5. 嵌套函数:在一个函数的函数体内用def定义一个新的函数

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

函数就是变量,定义一个函数就是把函数体赋值给函数名

示例1:

#!Author:lanhan
#@timmer,其实就是  test1=timmer(test1)
import time

def timmer(func):
    def warpper(*args,**kwargs):
        start_time=time.time()
        func()
        stop_time=time.time()
        print(‘the func run time is %s‘ %(stop_time-start_time))
    return warpper()

@timmer
def test1():
    time.sleep(3)
    print(‘in the test1‘)
test1

示例2:

#!Author:lanhan
#报错,bar()函数根本找不到函数体
def foo():
    print(‘in the foo‘)
    bar()
foo()

‘‘‘
def bar():
    print(‘in the bar‘)
def foo():
    print(‘in the foo‘)
    bar()
foo()
‘‘‘
# def foo():
#     print(‘in the foo‘)
#     bar()
# def bar():
#     print(‘in the bar‘)
# foo()



##报错,原因是内存中还没有解释到bar,foo()就执行了
def foo():
    print(‘in the foo‘)
    bar()
foo()
def bar():
    print(‘in the bar‘)
foo()

示例3:

#!Author:lanhan
‘‘‘
#bar函数是源代码,test1装饰bar,但缺点是修改了源代码的调用方式
import time
def bar():
    time.sleep(3)
    print(‘in the bar‘)

def test1(func):
    start_time=time.time()
    func()    #run bar  bar的运行时间
    stop_time=time.time()
    print("the func run time is %s" %(stop_time-start_time))

test1(bar)         #bar=func
#bar()      #直接调用不能增加附加功能
‘‘‘

import time
def bar():
    time.sleep(3)
    print(‘in the bar‘)
def test2(func):
    print(func)      #新增功能
    return func
#print(test2(bar))
bar=test2(bar)
bar()           #b.返回值中包含函数名(不修改函数的调用方式),bar是内存地址,相当于门牌号,bar()则是调用函数
#print(t)
#t()

示例4:

#!Author:lanhan
#嵌套函数
def foo():
    print(‘in the foo‘)
    def bar():     #函数即变量,所以可看成是局部变量,拥有局部变量特性。只在局部能被调用
        print(‘in the bar‘)
    bar()
foo()

示例5:

import time
def timer(func):       ##func=test1
    def deco():
        start_time=time.time()
        func()         ##run test1
        stop_time=time.time()
        print("the func run time is %s" %(stop_time-start_time))
    return deco      ##返回deco内存地址
@timer               ##test1=timer(test1)
def test1():
    time.sleep(3)
    print(‘in the test1‘)
@timer         ##test2=timer(test2)  = deco  test2()  =deco()
def test2():
    time.sleep(3)
    print(‘in the test2‘)
‘‘‘
test1=deco(test1)
test1()
test2=deco(test2)
test2()
‘‘‘
#test1=(timer(test1))      #test1=deco的内存地址
test1()                   #执行deco函数
#test2=(timer(test1))      #test1=deco的内存地址
test2()                   #执行deco函数

示例6:

#同个装饰器装饰不同个数的参数的函数

import time
def timer(func):       ##func=test1
    def deco(*args,**kwargs):
        start_time=time.time()
        func(*args,**kwargs)         ##run test1
        stop_time=time.time()
        print("the func run time is %s" %(stop_time-start_time))
    return deco      ##返回deco内存地址
@timer               ##test1=timer(test1)
def test1():
    time.sleep(3)
    print(‘in the test1‘)
@timer         ##test2=timer(test2)  = deco  test2()  =deco()
def test2(name,age):
    print("test2:",name,age)
#test1=(timer(test1))      #test1=deco的内存地址
test1()                   #执行deco函数
#test2=(timer(test1))      #test1=deco的内存地址
test2("lanhan",22)                   #执行deco函数

示例7:

#!Author:lanhan
#装饰器传参数,实现同个装饰器实现多个不同功能
import time
user,passwd = ‘lanhan‘,‘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("Password:").strip()
                if user == username and passwd == password:
                    print("\033[32;1mUser has paswd authentication\033[0m")
                    res = func(*args,**kwargs)
                    print("---after authentication")
                    return res                 ##把"from home"返回
                else:
                    exit("\033[32;1mInvalid username or password\033[0m")
            elif auth_type == "ldap":
                print("搞毛线ldap,不会...")
        return wrapper
    return outer_wrapper
def index():
    print("welcome to index page")
@auth(auth_type="local")      ## home = wrapper()
def home():
    print("welcome to home page")
    return "from home"
@auth(auth_type="ldap")
def bbs():
    print("welcome to bbs page")

index()
#home()
print(home())
bbs()

时间: 2024-11-25 19:45:50

python之路-11-装饰器的相关文章

从零开始的Python学习Episode 11——装饰器

装饰器 装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象. 简单的装饰器 1 import time 2 3 def show_time(f): 4 def inner(): 5 start = time.time() 6 f() 7 end = time.time() 8 print('time: %s'%(end-start)) 9 return inner 10 11 @show_time 12 def fun1(): 13 p

Python不归路_装饰器(二)

装饰器上节回顾 装饰器主要是由高阶函数和嵌套函数组成的,它由有两大特性:1.不改变被装饰函数原代码:2.不改变被装饰函数调用方式 高阶函数主要有两大特性:1.被装饰函数作为高阶函数的参数:2.return函数 嵌套函数特性:在一个函数内,新定义一个函数 下面我们来看一段代码,给login_index()和login_mang()添加用户密码认证的功能的装饰器. user='gally' #定义用户名 password='123' #定义密码 def auth(func): #定义装饰器 被装饰函

Python不归路_装饰器(一)

装饰器 装饰器 什么是装饰器?给现有函数添加新功能的函数,不更改现有函数源代码,现有函数调用方式.装饰器是由高阶函数和嵌套函数组成. 概括上面这句话的意思:1.装饰器 - - - > 函数 : 2.不更改现有函数源代码 3.不更改现有函数调用方式 4.装饰器对于函数来说是透明的(不产生任何影响) 装饰器运用的情景:在生产环境中,业务不能中断时,要给某些大量调用函数填加新功能时. 高阶函数  怎么样的函数才是高阶函数 1.把函数名作为实参传递给另外一个函数 2.返回值中包括函数 下面我们来感受下高

Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func):    #定义装饰器     de

python 3.x 的装饰器笔记

今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python 2.7在用法上差不多. 现在某个视频公司有一段代码,,代码的主要功能就是看电影. 1 def watchfilm(): 2 print('You are watching film now....') 3 4 watchfil() 运行之后输出: You are watching film now

Python 函数式编程、装饰器以及一些相关概念简介

Python 中的 Decorator(装饰器) 是对一个函数或者方法的封装,从而使其可以完成一些与自身功能无关的工作. 预备知识 一切皆对象 在 Python 中,所有的一切都被视为对象,任何的变量.函数.类等都是 object 的子类.因此除了变量之外,函数和类等也可以被指向和传递. >>> def foo(): ... pass ... >>> def Foo(): ... pass ... >>> v = foo >>> v

python高级编程之装饰器04

from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #with和contextlib #对于要确保即使发生一个错误时也能运行一些清理代码而言,try...finally语句很有用,对以下场景,如: """ 关闭一个文件, 释放一个锁 创建一个临时代码补丁 在特殊环境中运行受保护代码 ----------- with语句覆盖

python高级编程之装饰器02

#装饰器02 #参数检查 #主要是用在接收或者返回函数,在特定上下文执行时可能有用 #例如:有一个函数通过XML-RPC调用,python将不能和静态类语言中一样直接提供它的完整签名,当XML-RPC客户要求函数签名时,就需要这样的能力 """ xml-rpc相关学习:http://zh.wikipedia.org/wiki/XML-RPC """ #装饰器能提供这种签名类型,并确保输入输出与此有关,如下 from itertools impor

python高级编程之装饰器01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #装饰器01 #特点是:使得函数和方法封装(接收一个函数并返回增强版本一个函数) #语法:原始场景可以将方法 在定义首部将其定义为类方法或者静态方法,在未使用装饰器之前,语法如下: class WhatFort(object): def it(cls): print 'work with %s:'%cls it=classmethod(it) def uncommo

python 中多个装饰器的执行顺序

python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inner1') ret = f1(*args,**kwargs) return ret return inner1 def wrapper2(f2): print('in wrapper2') def inner2(*args,**kwargs): print('in inner2') ret = f2