`

python中的函数修饰符

阅读更多

首先,什么是函数修饰符?函数修饰符就是对原有函数做一层包装。比如有以下两个函数:

 

def func1():
    print 'I am function func1'
def func2():
    print 'I am function func2'

 

现在我们想为这两个函数增加一段共同的操作,这时就可以使用函数修饰符。

首先我们定义一个修饰函数,先不做任何处理,仅仅打印一条横线:

 

def de(f):
    def _call_():
        print '-------------------------------'
        return f()
    return _call_

 

使用这个修饰符:

 

@de
def func1():
    print 'I am function func1'
@de
def func2():
    print 'I am function func2'
    
if __name__ == '__main__':
    func1()
    func2()

 

运行结果为:

 

E:\开发文档2\python\demo>修饰符.py

-------------------------------

I am function func1

-------------------------------

I am function func2

 

可以看到,修饰符起作用了。 

 

注意: 

1.修饰符等价于包装调用:

 

@de

def func1:

----- 等价于 ------

func1 = de(func1)

 

2.修饰函数必须返回一个“可调用对象”:

 

def de( f ):

    def _call_():

        return f()

    return _call_ # 返回的是一个函数体,而非调用_call_()

 

 

下一个问题:如果各个被修饰函数有不同的参数,怎么处理呢?

例如:

 

def func1(lst1,lst2):

    # 合并两个list,并打印各项

    for item in lst1+lst2:

        print item

def func2(dic):

    # 循环dict,打印各key-value

    for k, v in dic.items():

        print k, v

 

这两个函数参数不同,又都没有异常处理,现在我们想增加上,使用修饰符这样处理:

 

import sys
import traceback
def de(f):
    def _call_( *args, **kwargs ):
        try:
            return f( *args, **kwargs )
        except:
            print 'param type error'
    return _call_
@de
def func1(lst1,lst2 ):
    for item in lst1+lst2:
        print item
@de
def func2( dic ):
    for k, v in dic.items():
        print k, v
if __name__ == '__main__':
    func1( [1,2], [3,4] )
    #func2( {1:'a',2:'b'})
    func2( [1,2])

 

这里使用了可变参数*args和**kwargs,这样会把所有接收来的参数,原样不动的再转给原函数,是惯用法。 

以上程序运行结果: 

 

E:\开发文档2\python\demo>修饰符带参数.py

1

2

3

4

param type error

分享到:
评论

相关推荐

    python函数修饰符@的使用方法解析

    主要介绍了python函数修饰符@的使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    【JavaScript源代码】VUE入门学习之事件处理.docx

     系统修饰键 .exact 修饰符 鼠标按钮修饰符 .exact 修饰符 鼠标按钮修饰符 总结 1. 函数绑定 可以用v-on:click="methodName"或者快捷方式 @click="methodName"绑定事件处理函数 @click="m

    python实现装饰器、描述符

    概要 本人python理论知识远达不到传授级别,写文章主要目的是自我总结,并不能照顾所有人...假定有一个需求是:打印程序函数运行顺序 此案例打印的结果为: foo1 function is starting foo2 function is starting ''

    Python核心编程第二版

     4.6.5 Python类型操作符和内建函数总结   4.7 类型工厂函数   4.8 标准类型的分类   4.8.1 存储模型   4.8.2 更新模型   4.8.3 访问模型   4.9 不支持的类型   4.10 练习   第5章 数字 ...

    Python编码风格指南(中文版)

    2.17 函数和方法修饰符 2.18 线程 2.19 高级特性 3. Python 编码风格方面的准则 3.1 分号 3.2 每行长度 3.3 圆括号 3.4 缩进 3.5 空行 3.6 空格 3.7 Python 解释器 3.8 注释 3.9 类 3.10 字符串 3.11 TODO style ...

    Python核心编程第二版(ok)

     4.6.5 Python类型操作符和内建函数总结   4.7 类型工厂函数   4.8 标准类型的分类   4.8.1 存储模型   4.8.2 更新模型   4.8.3 访问模型   4.9 不支持的类型   4.10 练习   第5章 数字 ...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

     4.6.5 python类型操作符和内建函数总结   4.7 类型工厂函数   4.8 标准类型的分类   4.8.1 存储模型   4.8.2 更新模型   4.8.3 访问模型   4.9 不支持的类型   4.10 练习   第5章 数字 ...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

     4.6.5 python类型操作符和内建函数总结   4.7 类型工厂函数   4.8 标准类型的分类   4.8.1 存储模型   4.8.2 更新模型   4.8.3 访问模型   4.9 不支持的类型   4.10 练习   第5章 数字 ...

    Python3 菜鸟查询手册

    11.05 字典 in 操作符.png 11.06 字典 items() 方法.png 11.07 字典 keys() 方法.png 11.08 字典 setdefault() 方法.png 11.09 字典 update() 方法.png 11.10 字典 values() 方法.png 11.11 字典 pop() 方法....

    带标签_超详细笔记以及拓展延伸知识点总结_小甲鱼零基础入门学习python系列教程

    延:Python函数修饰符(装饰器)的使用 59 23讲:递归:这帮小兔崽子 62 24讲:递归:汉诺塔 63 17-24讲:阶段总结 64 25讲:字典:当索引值不好用时 65 26讲:字典:当索引值不好用时2 66 26延:你知道Python的字典是...

    Head First Python(第2版) 配套源码

    如果你想知道利用上下文管理器、修饰符、推导式和生成器能够做什么,都可以在这本书中找到。本书将提供一个完整的学习体验,帮助你迅速成为一名Python程序员。为什么这本书如此与众不同?根据认知科学和学习理论的z...

    Python拾趣009 修饰器@简介和简单应用

    在写类的时候经常用到@staticmethod或@classmethod修饰符,这样就可以不需要实例化,直接类名.方法名()来调用。 所以修饰器用到好多地方的。 例子 PyQt AND OpenCV By LiNYoUBiAo 2020/4/19 19:49 from functools...

    正则表达式单行、多行模式简介(使用说明)

    目前常用正则表达式都有该使用选项,如:javascript 正则表达式,一般是:”/正则表达式匹配字符/修饰符“ ,最后一个”/” 后面是修饰符。然后,php也是类似的,c#,python等,一般调用正则表达式的匹配函数,都有...

    Autologging:更轻松地记录和跟踪Python函数和类方法。-开源

    自动记录提供两个修饰符和一个自定义日志级别:“ autologging.logged”装饰一个类以创建__log成员。 默认情况下,记录器是以类的包含模块和名称(例如“ my.module.ClassName”)命名的。 “ autologging.traced”...

    javascript-to-python:我试图创建一个从简单Javascript到python的翻译器

    注意:Python并不是天生就支持异步功能,因此在JavaScript中将异步的所有功能都将在python中同步运行,因此在转换为python时,所有async / await修饰符都将被忽略。 注意:您可以在JavaScript文件中使用本机python...

    Python与Java在面向对象机制方面的比较.pdf

    从顶层类及其内置函数、类的对象实例化、类的权限修饰符、抽象类和接口、构造函数和析构函数等面向对象机制的几个方面分析和比较了Python语言与java语言的不同。归纳总结这些不同,有助于软件设计方法和软件编程教育...

    cachetools:可扩展的备忘录集合和装饰器

    该模块提供了各种备注集合和修饰符,包括Python标准库的函数修饰符的变体。 from cachetools import cached , LRUCache , TTLCache # speed up calculating Fibonacci numbers with dynamic programming @ cached ...

    python-pattern-matching:像功能语言一样的Python模式匹配

    Python模式匹配 ... 这些语法,运算符和修饰符中的每一个实际上都是模式匹配应用程序中的一个细节。 很多人以前都尝试过使这项工作生效。 不知何故没有。 我应该把它叫做另一个python模式匹配模块,但是

    Python中static相关知识小结

    static用法:是一个修饰符,用于修饰成员(成员变量,成员函数).当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用,格式——类名.静态成员。

    ai-docstring:Visual Studio Code扩展,可使用AI(NLP)技术为python函数快速生成文档字符串

    VSCode Python AI文档字符串生成器Visual Studio Code扩展,可使用AI(NLP)技术为python函数快速生成文档字符串。 该项目是为分叉的。 以前,功能描述必须由用户编写,但AI会看到代码并进行总结。产品特点AI快速...

Global site tag (gtag.js) - Google Analytics