python3练习-装饰器

  在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程。记录一下自己的课后习题解法。

问题:
请编写一个decorator,能在函数调用的前后打印出‘begin call‘和‘end call‘的日志。写出一个@log的decorator,使它既支持:
@log
def f():
    pass

又支持:
@log(‘execute‘)
def f():
    pass
示例代码(个人练习,如有问题欢迎斧正):
# ! usr/bin/env python3
# -*- coding:utf-8 -*-

import functools

def log(*text):
    def decorator(func):
        @functools.wraps(func)
        def warpper(*args,**kw):
            if(isinstance(text,(list,tuple))):
                print(‘Info:‘ , text)
                print(‘begin call %s():‘ % func.__name__)
            else:
                print(‘begin call %s():‘ % func.__name__)
            func(*args,**kw)
            print(‘-------‘,‘end call %s():‘ % func.__name__,‘--------------‘)
        return warpper
    return decorator

@log([‘execute‘,‘beginOtherInfo‘])
def now():
    print(‘test function‘)

@log()
def now2():
    print(‘test function2‘)
now()
now2()
时间: 2024-10-11 17:09:20

python3练习-装饰器的相关文章

Python3.5:装饰器的使用

在Python里面函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数,简单来说函数也是变量也可以作文函数的参数 >>> def funA(): ... print('i an funA') ... time.sleep(1) >>> f = now >>> f() i am funA 函数对象有一个__name__属性,可以拿到函数的名字: >>> funA.__name__ 'funA' >>&

python3之装饰器

1.装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限验证等场景,装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 装饰器的实现原理: #无参数装饰器原理: def login(funct): print('passed us

python3 装饰器

看廖雪峰官网的python3装饰器有感 装饰器即将一个函数作为变量在新的函数中调用此函数. 作业: 能否写出一个@log的decorator,使它既支持: @logdef f():     pass 又支持: @log('execute')def f():     pass      例1: import functools import time def log(*args,**kwargs):     # *args 是个元组     if args and isinstance(args,

python3.5.2之装饰器(1)

一.本次实验环境: 在腾讯云虚拟主机centos7上配置pyenv多版本python管理器,并安装交互式web编辑器jupyter,python版本为3.5.2.  二.装饰器: 装饰器的本质是一个函数,接收一个函数作为参数,并且返回一个函数 带参数的装饰器是一个函数,返回一个装饰器 带参数的装饰器最多允许一层,timeit()()(不允许) 在python中,一个函数可以作为参数传递给另外一个函数,还可返回一个函数(不了解此请看高阶函数)因此,我们可以把一个函数传递给另一个函数后,在这个被传递

s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法

python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf-8_*_ 或者将字符串单独声明: a = "中文".encode("utf-8") 函数式编程 函数式编程中的函数指代的是数学中的函数. 函数式编程输入如果确定,则输出一定是确定的.函数中并没有很多逻辑运算 python是一个面向对象的语言,只是一部分支持函数式编程.

python3 如何给装饰器传递参数

[引子] 之前写过一篇文章用来讲解装饰器(https://www.cnblogs.com/JiangLe/p/9309330.html) .那篇文章的定位是入门级的 所以也就没有讲过多的高级主题,决定在这里讲一下如果为装饰器传递参数 [目标] 我们有两个函数"add_fun"."add" 其中"add_fun"已经过时.如果用户有调用这个函数的话就提示它"add_fun"已经过时并且引导 它去调用"add"

python3学习之装饰器

#定义装饰器,outer参数是函数,返回也是函数 #作用:在函数执行前和执行后分别附加额外功能 def  outer(func):     def  inner(*args, **kwargs):         print("log")         func(*args, **kwargs)         print("Don't back")         # return "r"     return inner @outer de

python3.6面向对象的多继承与装饰器

# 多继承 class A: def show(self): print('AAAA') class B: def fun(self): print('BBBB') class C(B,A): pass x = C() # 类的特殊方法 ''' 类属性: __dict__ : 类的属性(包含一个字典,由类的数据属性组成) __doc__ :类的文档字符串 __name__: 类名 ''' x = 'a\nb' #print(repr(x)) #实例调用: ''' __init__    初始化

python3 闭包函数,装饰器

闭包函数: 1.定义在函数内部的函数 2.包含对外部作用域而非全局作用域的引用特点: 1.自带作用域 2.延迟计算(取到内存地址,加括号执行) def 外部函数(func): def 内部函数(*args,**kwargs): pass return 内部函数 f=外部函数(func) print(f.__closure__) print(f.__closure__[0].cell_contents) 优点: 1 自带作用域 2 惰性延迟 1.开放封闭原则,对扩展是开房的,对修改是封闭的2.装饰