Python学习---装饰器的学习1210

装饰器的基础

学习前提: 作用域 + 函数的理解 + 闭包  【学习,理解】

代码编写原则: 对修改开放对扩展开放

装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

装饰器的应用:经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等应用场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

装饰器作用:装饰器感觉就像是内部函数的调用应用,为已经存在的对象添加额外的功能。

原理讲解

基础原理讲解:不更改原来函数foo()的调用的基础上添加新的功能【假设每次都调用foo】

import  time
# 利用内部函数 来实现装饰器
def show_time(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print("耗时", str(end - start))
    return inner
def foo():
    print(‘foo‘)
    time.sleep(2)
def bar():
    print(‘bar‘)
    time.sleep(3)
# 这里就是装饰器,添加了新功能的同时还不影响原来的函数应用
foo = show_time(foo)
foo()
bar = show_time(bar)
bar()

Python的装饰器的实现:

@功能函数

import  time
def show_time(f):
    def inner():
        start = time.time()
        f()
        end = time.time()
        print("耗时", str(end - start))
    return inner
@show_time   # foo = show_time(foo)
def foo():
    print(‘foo‘)
    time.sleep(2)
@show_time   # bar = show_time(bar)
def bar():
    print(‘bar‘)
    time.sleep(3)
foo()
bar()

装饰器之被装饰函数的参数:

参数在功能函数上添加, 装饰器参数对应的添加即可

import  time
def show_time(f):
    def inner(*args):
        start = time.time()
        f(*args)
        end = time.time()
        print("耗时", str(end - start))
    return inner
@show_time   # foo = show_time(foo)
def foo(*args):
    summary = 0
    for i in args:
        summary += i
    print(summary)
    time.sleep(2)
@show_time   # bar = show_time(bar)
def bar():
    print(‘bar‘)
    time.sleep(3)
foo(2, 4, 4)
bar()

装饰器之装饰函数的参数:

多一层嵌套实现,代码更加灵活

# foo函数添加日志的写操作, bar函数不添加
import  time

def logger():
    logger_format = ‘%F %T‘
    with open(‘log.txt‘, ‘a+‘, encoding=‘utf-8‘) as f:
        f.write(‘当前时间是:%s\n‘% time.strftime(logger_format))
def log(flag = ‘‘):
    def show_time(f):
        def inner(*args):
            start = time.time()
            f(*args)
            end = time.time()
            print("耗时", str(end - start))
            if flag == ‘true‘:
                logger()
        return inner
    return show_time
@log(‘true‘)   # 等价于@show_time(‘true‘)  / show_time = show_time(‘true‘)
def foo(*args):
    summary = 0
    for i in args:
        summary += i
    print(summary)
    time.sleep(2)
@log(‘‘)       # 等价于@show_time(‘‘)  / show_time = show_time(‘‘)
def bar():
    print(‘bar‘)
    time.sleep(3)
foo(2, 4, 4)
bar()

复杂装饰器

def makebold(fn):
    def wrapper():
        return "<b>" + fn() + "</b>"
    return wrapper
def makeitalic(fn):
    def wrapper():
        return "<i>" + fn() + "</i>"
    return wrapper
@makebold
@makeitalic
def hello():
    return "hello world"
print(hello())  #  <b><i>hello world</i></b>

原文地址:https://www.cnblogs.com/ftl1012/p/9382699.html

时间: 2024-11-09 02:12:09

Python学习---装饰器的学习1210的相关文章

Python学习---装饰器/迭代器/生成器的学习【all】

Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210 原文地址:https://www.cnblogs.com/ftl1012/p/9484145.html

Python装饰器的学习笔记(转载)

Python装饰器的学习笔记 2017-05-18 程序员共读 来自:标点符的<Python装饰器的学习笔记> 链接:http://www.biaodianfu.com/python-decorator.html 原文:http://stackoverflow.com/questions/739654/how-to-make-a-chain-of-function-decorators-in-python#answer-1594484 装饰器(decorator)是一种高级Python语法.可

python之循序渐进学习装饰器

python装饰器的定义:在代码运行期间在不改变原函数定义的基础上,动态给该函数增加功能的方式称之为装饰器(Decorator) 装饰器的优点和用途: 1. 抽离出大量函数中与函数功能本身无关的的雷同代码并继续重用.2. 使用装饰器可以将函数"修饰"为完全不同的行为,可以有效的将业务逻辑正交分解,如用于将权限与身份验证从业务中独立出来.3. 如果一个函数需要一个功能,且这个功能可以被使用在很多函数上,或是函数并不是自己实现,那可以写个装饰器来实现这些功能.概况来说,装饰器的作用就是为已

Python之装饰器学习

学习装饰器之前,掌握以下三点知识:1.作用域:查找变量顺序:L——E——G——Bx=10def f(): t=5 t是嵌套作用域def inner():count=7 count是局部变量,作用域local域return 12.高阶函数:1>函数名可以作为参数输入2>函数名可以作为返回值 3.闭包def outer(): x=10 def inner(): print(x) return innerouter()() 调用inner 1.局部变量,全局无法调用2.inner是内部函数.x是外部

python函数装饰器

学习装饰器前提需要了解高阶函数,函数嵌套,函数闭包 python函数装饰器,顾名思义就是装饰函数,为函数添加新功能的的一种方式. 为什么要使用装饰器呢? 因为函数在运行时,如果不使用装饰器对函数进行功能添加,需要修改函数源代码,这样修改无疑会增加程序的冗余和复杂性,也不便于程序员对其进行修改.使用装饰器,可以在不改变函数源代码和调用方式的前提下,使用语法糖@装饰器,对函数功能进行添加. 装饰器本质上就是一个函数. 我们使用一个简单的例子来实现: import time #这是一个装饰器函数名为t

Python之装饰器、迭代器和生成器

在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思来谁就是对特定的建筑物内按照一定的思路和风格进行美化的一种行为,所谓“器”就是工具,对于python来说装饰器就是能够在不修改原始的代码情况下给其添加新的功能,比如一款软件上线之后,我们需要在不修改源代码和不修改被调用的方式的情况下还能为期添加新的功能,在python种就可以用装饰器来实现,同样在写

python之装饰器、生成器、内置函数、JSON

一.装饰器: 装饰器,器在这里的意思是函数,也就是装饰函数.作用是给其他函数添加新功能,它可以不改变原有的函数,原来的函数和原来一模一样,什么都不需要改变,只需要在函数外部加上调用哪个装饰器就可以了,装饰器的作用就是不改变原来函数的调用方式,不改变原来函数的代码,给它增加了一个新功能.但是不改变函数,给它增加新功能,那是不可能的,装饰器只不过是偷偷改变了原来的函数而已,而原来的函数不知不觉. 学习装饰器前的知识储备: 1.函数即变量,在python里面函数就是一个变量,函数名就是变量名,函数名里

python之-- 装饰器

高阶函数+嵌套函数 == 装饰器 什么是装饰器: 其实也是一个函数. 功能:为其他的函数添加附加功能 原则:不能修改被装饰的函数的源代码和调用方式 学习装饰器前首先要明白以下3条事项: 1:函数 即 "变量" (什么意思呢,就是说我们定义的一个函数,其中函数名就是一个变量,函数体就是存于内存的数据). def foo(): #函数名就相当于变量 print('test') #函数体就相当于内容 类似于:x(变量) = 1(内容) 内容实际存储于内存,变量相当于门牌号(映射内存内容).

尝试自己的Perl语言的包 TCP协议的再包装起到类似python语言装饰器的效果

#!/usr/bin/perl # Filename: BuildSocketTCP.pm # #   Copyright 2012 Axxeo GmbH #   Licensed under the Apache License, Version 2.0 (the "License"); #   you may not use this file except in compliance with the License. #   You may obtain a copy of t