python笔记 - day4-之装饰器

               python笔记 - day4-之装饰器

需求:
给f1~f100增加个log:
def outer():                #定义增加的log
    print("log")  

def f1():
    outer()                   #分别调用函数
    print("F1")

def f2():
    outer()                   #分别调用函数
    print("F2")

def f100():
    outer()                   #分别调用函数
    print("F100")

f1()
f2()
f100()

使用装饰器,增加log:
def outer(func):
    def inner():
        print("log")
        return func()
    return inner

@outer
def f1():
    print("F1")

@outer
def f2():
    print("F2")

@outer
def f100():
    print("F100")

f1()
f2()

并增加after:
def outer(func):
    def inner():
        print(‘log‘)
        ret = func()
        print("after")
        return ret
    return inner

@outer
def f1():
    print("F1")

@outer
def f2():
    print("F2")

@outer
def f100():
    print("F100")

f1()
f2()

装饰器流程剖析:

声明:
【函数的整体是可以被其他函数当做参数所调用,传递的】
def f1():
    print(‘123‘)

def f2(xxx):
    xxx()
f2(f1)

结果:123

流程剖析,例一:
def outer(func):
    print(123,func)

@outer
def f1():
    print(‘F1‘)

Readme:
1.执行程序后,会把123,重新赋值给f1,并且把老的,加载到内存的f1“print(‘F1‘)”,当做参数,当做参数,传给func;
2.print(123,func),func,就是老的f1,通过传给func打印出来;

流程剖析,例二:
def outer(func):
    def inner():
        print(‘before‘)  #赋值给下面的f1
        func()             #调用执行老的f1
        print(‘after‘)
    return inner  #把结果返回给下面f1,并赋值给下面的f1;(注意:这里加括号,就是执行函数;不加括号,就是把inner函数体所有内容返回给f1,并重新赋值给f1)

@outer
def f1():
    print(‘F1‘)

f1() 

Readme:
* 定义了两个函数,没有调用函数,不会执行;
功能一:
加上@outer,(@ + 函数名)后实现的效果:
    自动执行outer函数,并且将其下面的函数名f1当作参数传递;
功能二:
    将outer函数的返回值,重新赋值给f1;

装饰器,返回值:
def outer(func):    def inner():        print(‘before‘)        r = func()        print(‘after‘)        return r    return inner

@outerdef f1():    print(‘F1‘)    return "砍你"

ret = f1()print("返回值:",ret)
装饰器,参数:
def outer(func):    def inner(a):        print(‘before‘)        r = func(a)        print(‘after‘)        return r    return inner

@outerdef f1(arg):    print(arg)    return "砍你"

ret = f1(‘fafafa‘)print(ret)

装饰器,接收多个参数:
def outer(func):    def inner(*args,**kwargs):        print(‘before‘)        r = func(*args,**kwargs)        print(‘after‘)        return r    return inner

@outerdef f1(arg):    print(arg)    return "砍你"

ret = f1(‘fafafa‘)print("返回值:",ret)

@outerdef f2(arg1,arg2):    print("F2")

f2(‘bbbbb‘,‘ccccc‘)
 
				
时间: 2024-10-12 19:21:39

python笔记 - day4-之装饰器的相关文章

python笔记5:装饰器、内置函数、json

装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1) print('run....') 现有一个新的需求,希望可以记录下函数的运行时间,需要在代码中计算时间的代码: def run(): start_time = time.time() time.sleep(1) print('run....') end_time = time.time() pr

python笔记-4(装饰器、生成器、迭代器)

一.熟练掌握装饰器的原理 (在装饰器学习的过程中,查了看了很多资料,个人感觉走了很多的弯路,这个笔记,分享我的理解,希望能帮助到一些人.本文对装饰器的描述,侧重点是条理与逻辑思路,想通过从无到有的方式,描述一个理解的过程,重点在step by step 更快的理解这个东西) 需要理解装饰器的两大组成,使用装饰器时能解决不确定长度的形参传递.函数返回值及条件判断的场景. 1.使用装饰器的目的及原则 目的:为原来的函数增加一些新的功能,如日志输出,运行时间计算,登录退出等. 实现的原则(两点): (

python笔记第九天 装饰器

装饰器 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过继承或是直接修改源代码实现,那么可以使用装饰器模式.简单来说Python中的装饰器就是指某些函数或其他可调用对象,以函数或类作为可选输入参数,然后返回函数或类的形式.通过这个在Python2.6版本中被新加入的特性可以用来实现装饰器设计模式. 顺便提一句,在继续阅读之前,如果你对Python中的闭包(Closure)概念不清楚,请查看本文结尾后的附录,如果没有闭包的相关概念,很难恰当的理解Python中的装饰器.

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高级编程之装饰器04

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

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

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

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()

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