Python装饰器的两种使用心得

装饰器的基础使用(装饰带参函数)

def decorator(func):
    def inner(info):
        print('inner')
        func(info)
    return inner

@decorator
def show_info(info):
    print(info)

show_info('hello')

防止装饰器改变装饰函数名称

装饰器在装饰函数的时候由于返回的是inner的函数地址,所以函数的名称也会改变 show_info.__name__会变成inner,防止这种现象可以使用functools

import functools

def decorator(func):
	@functools.wraps(func)
    def inner(info):
        print('inner')
        func(info)
    return inner

@decorator
def show_info(info):
    print(info)

show_info('hello')

这样写就不会改变被装饰函数的名称

装饰器动态注册函数

此方法在Flask框架的app.Route()的源码中体现

class Commands(object):
    def __init__(self):
        self.cmd = {}

    def regist_cmd(self, name: str) -> None:
        def decorator(func):
            self.cmd[name] = func
            print('func:',func)
            return func
        return decorator

commands = Commands()

# 使得s1的值指向show_h的函数地址
@commands.regist_cmd('s1')
def show_h():
    print('show_h')

# 使得s2的值指向show_e的函数地址
@commands.regist_cmd('s2')
def show_e():
    print('show_e')

func = commands.cmd['s1']
func()

个人心得

在阅读装饰器代码时可以使用加(func_name)的方式
以为例

@commands.regist_cmd('s2')
def show_e():
    print('show_e')

即 show_e = commands.regist_cmd('s2')(show_e)

到此这篇关于Python装饰器的两种使用的文章就介绍到这了,更多相关Python装饰器使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python使用装饰器作日志处理的方法

    装饰器这东西我看了一会儿才明白,在函数外面套了一层函数,感觉和java里的aop功能很像:写了2个装饰器日志的例子, 第一个是不带参数的装饰器用法示例,功能相当于给函数包了层异常处理,第二个是带参数的装饰器用法示例,将日志输出到文件. ``` #coding=utf8 import traceback import logging from logging.handlers import TimedRotatingFileHandler def logger(func): def inner(*

  • python 装饰器的使用示例

    无参修饰 ,无参数时不需要调用 def log1(func): func() @log1 def test(): print('test:') 有参修饰 def log2(func): def inner(*args, **kwargs): func(*args, **kwargs) return inner @log2 def test(num): print('testlog2:',num,test.__name__) test(20) #相当于log(test(20)) @wraps可以保

  • python 使用装饰器并记录log的示例代码

    1.首先定义一个log文件 # -*- coding: utf-8 -*- import os import time import logging import sys log_dir1=os.path.join(os.path.dirname(os.path.dirname(__file__)),"logs") today = time.strftime('%Y%m%d', time.localtime(time.time())) full_path=os.path.join(lo

  • python装饰器使用实例详解

    这篇文章主要介绍了python装饰器使用实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python装饰器的作用就是在不想改变原函数代码的情况下,增加新的功能.主要应用了python闭包的概念,现在用1个小例子说明 import time def foo(): time.sleep(1) def bar(): time.sleep(2) def show_time(f): def inner(): start_time = time.t

  • python 装饰器的基本使用

    知识点 简单的装饰器 带有参数的装饰器 带有自定义参数的装饰器 类装饰器 装饰器嵌套 @functools.wrap装饰器使用 基础使用 简单的装饰器 def my_decorator(func): def wrapper(): print('wrapper of decorator') func() return wrapper() def test(): print('test done.') test = my_decorator(test) test 输出: wrapper of dec

  • Python装饰器使用你可能不知道的几种姿势

    前言 在Python中,装饰器是一种十分强大并且好用的语法,一些重复的代码使用装饰器语法的话能够使代码更容易理解及阅读. 因此在这里简单总结了一下Python中装饰器的几种用法以及需要注意的事情. 一.在装饰器中获取被装饰函数的参数 假设我们在开发web的时候,需要做反爬.要判断接口的访问来源我们就可以通过下面装饰器的方法来实现: def mydecorator(func): def wrapped(*args, **kwargs): print("进入装饰器") if args[0]

  • Python装饰器的两种使用心得

    装饰器的基础使用(装饰带参函数) def decorator(func): def inner(info): print('inner') func(info) return inner @decorator def show_info(info): print(info) show_info('hello') 防止装饰器改变装饰函数名称 装饰器在装饰函数的时候由于返回的是inner的函数地址,所以函数的名称也会改变 show_info.__name__会变成inner,防止这种现象可以使用fu

  • 详解Python装饰器的四种定义形式

    目录 前言 用函数装饰函数 用函数装饰一个类 用类定义装饰器,然后装饰一个函数 用类定义装饰器,然后装饰一个类 小结 前言 装饰器(decorator)在Python框架中扮演着重要角色,是Python中实现切面编程(AOP)的重要手段. aspect-oriented programming (AOP) ,在不改变代码自身的前提下增加程序功能 不改变代码自身,但需要在函数和类头上加一个标注(annotation),这个标注在Python里叫装饰器,在java里叫注解.在Python里,一共有四

  • Python装饰器基础详解

    装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果.相对于其它方式,装饰器语法简单,代码可读性高.因此,装饰器在Python项目中有广泛的应用. 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自己编写新的装饰器的更多高级语法. 什么是装饰器 装饰是为函数和类指定管理代码的一种

  • Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自己编写新的装饰器的更多高级语法. 什么是装饰器 装饰是为函数和类指定管理代码的一种方式.Python装饰器以两种形式呈现: [1]函数装饰器在函数定义的时候进行名称重绑定,提供一个逻辑层来管理函数和方法或随后对它们的调用. [2]类装饰器在类定义的时候进行名称重绑定,提供一个逻辑层来管理类,或管理随

  • python装饰器decorator介绍

    一.装饰器decorator decorator设计模式允许动态地对现有的对象或函数包装以至于修改现有的职责和行为,简单地讲用来动态地扩展现有的功能.其实也就是其他语言中的AOP的概念,将对象或函数的真正功能也其他辅助的功能的分离. 二.Python中的decorator python中的decorator通常为输入一个函数,经过装饰后返回另一个函数.  比较常用的功能一般使用decorator来实现,例如python自带的staticmethod和classmethod. 装饰器有两种形式:

  • 对于Python装饰器使用的一些建议

    装饰器基本概念 大家都知道装饰器是一个很著名的设计模式,经常被用于 AOP (面向切面编程)的场景,较为经典的有插入日志,性能测试,事务处理,Web权限校验, Cache等. Python 语言本身提供了装饰器语法(@),典型的装饰器实现如下: @function_wrapper def function(): pass @实际上是 python2.4 才提出的语法糖,针对 python2.4 以前的版本有另一种等价的实现: def function(): pass function = fun

  • 如何真正的了解python装饰器

    合理使用装饰器可以简化开发,并且使得代码更加清晰.下面我们分别介绍两种装饰器,不带参数的装饰器和带参数的装饰器. 一.不带参数的装饰器 我们用一个实际的例子来引入装饰器的概念,比如我们现在有一个方法A(),然后我们需要在方法A()执行之前在终端打印"function is running",这时候我们可以在方法A()的开始部分加上下面的代码: print("function is running") 但是如果我们不想修改方法A()的代码,也可以重新写一个方法deco

  • 无惧面试,带你搞懂python 装饰器

    写在之前 「装饰器」作为 Python 高级语言特性中的重要部分,是修改函数的一种超级便捷的方式,适当使用能够有效提高代码的可读性和可维护性,非常的便利灵活. 「装饰器」本质上就是一个函数,这个函数的特点是可以接受其它的函数当作它的参数,并将其替换成一个新的函数(即返回给另一个函数). 可能现在这么看的话有点懵,为了深入理解「装饰器」的原理,我们首先先要搞明白「什么是函数对象」,「什么是嵌套函数」,「什么是闭包」.关于这三个问题我在很久以前的文章中已经写过了,你只需要点击下面的链接去看就好了,这

  • python装饰器三种装饰模式的简单分析

    学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了! 这里就简单讨论下python的几种装饰模式: 一 无参装饰器: # 装饰器 import time # 装饰器,记录函数运行时间 def decorator01(fun): def wapper(): stime = time.time() fun() etime = time.time() print("fun run time is {TIME}".format(TIME=etim

随机推荐