python装饰器、模块

python装饰器

装饰器(decorator)是一种高级Python语法。装饰器可以对一个函数、方法或者类进行加工。在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一个函数的返回结果。相对于其它方式,装饰器语法简单,代码可读性高。因此,装饰器在Python项目中有广泛的应用。

由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用函数,假设我们要增强函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),decorator就是一个返回函数的高阶函数。

装饰器方法

  • 先定义一个简单的函数,计算平方和
# get square sum
def square_sum(a, b):
    return a**2 + b**2
print(square_sum(3, 4))

如果要为square_sum()函数添加打印功能,修改后的写法如下:
# get square sum
def square_sum(a, b):
    print("intput:", a, b)
    return a**2 + b**2

print(square_sum(3, 4)

使用装饰器实现修改:
def decorator(F):
    def new_F(a, b):
        print("input", a, b)
        return F(a, b)
    return new_F
# get square sum
@decorator
def square_sum(a, b):
    return a**2 + b**2
print(square_sum(3, 4))

def decorator(F):
    def new_F(a, b):
        print("input", a, b)
        return F(a, b)
    return new_F

# get square sum
@decorator
def square_sum(a, b):
    return a**2 + b**2

print(square_sum(3, 4))

装饰器可以用def的形式定义,如上面代码中的decorator。装饰器接收一个可调用对象作为输入参数,并返回一个新的可调用对象。装饰器新建了一个可调用对象,也就是上面的new_F。new_F中,我们增加了打印的功能,并通过调用F(a, b)来实现原有函数的功能。

定义好装饰器后,可以通过@语法使用了。在函数square_sum定义之前调用@decorator,实际上将square_sum传递给decorator,并将decorator返回的新的可调用对象赋给原来的函数名(square_sum)。 所以,当调用square_sum(3, 4)的时候,就相当于:

square_sum = decorator(square_sum)
square_sum(3, 4)

从本质上,装饰器起到的就是这样一个重新指向变量名的作用(name binding),让同一个变量名指向一个新返回的可调用对象,从而达到修改可调用对象的目的,如果有其他的类似函数,可以继续调用decorator来修饰函数,而不用重复修改函数或者增加新的封装。

含参的装饰器

装饰器调用中,比如@decorator,该装饰器默认它后面的函数是唯一的参数。装饰器的语法允许我们调用decorator时,提供其它参数,比如@decorator(a)。

# a new wrapper layer
def pre_str(pre=‘‘):
    # old decorator
    def decorator(F):
        def new_F(a, b):
            print(pre + "input", a, b)
            return F(a, b)
        return new_F
    return decorator

# get square sum
@pre_str(‘hello‘)
def square_sum(a, b):
    return a**2 + b**2上面的pre_str是允许参数的装饰器。它实际上是对原有装饰器的一个函数封装,并返回一个装饰器。我们可以将它理解为一个含有环境参量的闭包。当我们使用@pre_str(‘hello‘)调用的时候,Python能够发现这一层的封装,并把参数传递到装饰器的环境中。该调用相当于
square_sum = pre_str(‘hello‘) (square_sum)

python模块、包

1、import语句

在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入,语法如下:

import module1[, module2[,... moduleN]

 model.py语句

def run():    print(‘这个是当前目录下的,这是在model里面的run函数‘)def run1():    print(‘run1‘)def run2():    print(‘run2..‘)name = 5print(‘66666‘)

model2.py语句
import modelmodel.run1()model.run2()model.run()

输出:

66666
test
run1
run2..
这个是当前目录下的,这是在model里面的run函数

说明:import的本质就是把这个python文件从头到尾执行一遍

2、from…import 语句

Python的from语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:

from modname import name1[, name2[, ... nameN]]

 from model import run,run1 run() run1()

输出:66666这个是当前目录下的,这是在model里面的run函数run1

3、From…import* 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

from modname import *

注:从一个模块里面导入所有的函数,不建议过多使用。

4、搜索路径和路径搜索

模块的导入需要叫做“路径搜索”的过程。

搜索路径:查找一组目录

路径搜索:查找某个文件的操作

Python搜索模块的路径:
1)、程序的主目录
2)、PTYHONPATH目录(如果已经进行了设置)
3)、标准连接库目录(一般在/usr/local/lib/python2.X/)
4)、任何的.pth文件的内容(如果存在的话).新功能,允许用户把有效果的目录添加到模块搜索路径中去

ImportError: No module named myModule,这种错误就是说:模块不在搜索路径里,从而导致路径搜索失败!解决方法:1、在调用文件中添加sys.path.append("模块文件目录");         2、使用pth文件,在 site-packages 文件中创建 .pth文件,将模块的路径写进去,一行一            个路径,以下是一个示例,pth文件也可以使用注释:            # .pth file for the  my project(这行是注释),命名为xxx.pth文件            C:\Users\Administrator\Desktop\test

5、包

包是一种管理 Python 模块命名空间的形式,采用"点模块名称",比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B ,如:

 import sound.effects.echo   

包和文件夹的区别就是包下面有个__init__.py,在python2里面,如果你要导入其他文件夹下面的python文件,那么必须是一个包

python3不需要,只是文件夹就行了

  


 



 

时间: 2024-11-08 06:18:24

python装饰器、模块的相关文章

深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去.但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条

python装饰器的小细节

以下是我看见python装饰器的一些我不熟悉的特点,所以记录一下 1 装饰器的特性: 1.1 可以吧被装饰的函数替换成不同的函数  decorate(func). 1.2 加载模块时候立即执行.这点很有用 2 闭包的特点: 2.1 inner 能访问 outer 及其祖先函数的命名空间内的变量(局部变量.函数参数) 2.2 调用 outer 已经反悔了,但是他的命名空间被返回的 inner 对象引用,所以不会被回收 3 functool.wraps(func): 总结起来就是保存了func的 _

python装饰器Decorators

http://blog.csdn.net/pipisorry/article/details/41902599 Introduction 装饰器Decorators是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能.装饰器用于在不改变原函数代码的情况下修改已存在的函数.常见场景是增加一句

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

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

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的高级函数应用的一个技巧

python装饰器终极奥义

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

理解Python装饰器(一)

python装饰器 装饰器是什么?我也不知道该如何给装饰器下定义. 1. 装饰器是函数,因为从代码的层面上来说,它就是开发人员定义的一个函数而已: 2. 装饰器就像是类的继承一样,通过装饰符,来实现函数与函数.函数与类之间的"继承" 3. 装饰器是种特殊的语法,通过 `@函数名` 或者 `@类名` 来实现函数或类的继承,但是 装饰器不是继承,装饰器装饰的函数会被当做参数传递给装饰器,这个功能又好像 C++中的虚函数,装饰器装饰的函数用来修改装饰器本身的功能来实现额外功能的添加. 示例:

Python装饰器详解,详细介绍它的应用场景

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): r