廖雪峰python摘录5

1、假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。

2、由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。

3、wrapper()函数的参数定义是(*args, **kw),因此,wrapper()函数可以接受任意参数的调用。在wrapper()函数内,首先打印日志,再紧接着调用原始函数。

4、

因为返回的那个wrapper()函数名字就是‘wrapper‘,所以,需要把原始函数的__name__等属性复制到wrapper()函数中,否则,有些依赖函数签名的代码执行就会出错。

不需要编写wrapper.__name__ = func.__name__这样的代码,Python内置的functools.wraps就是干这个事的,所以,一个完整的decorator的写法如下:

 1 import functools
 2
 3 def log(text):
 4     def decorator(func):
 5         @functools.wraps(func)
 6         def wrapper(*args, **kw):
 7             print(‘%s %s():‘ % (text, func.__name__))
 8             return func(*args, **kw)
 9         return wrapper
10     return decorator
时间: 2024-08-07 04:33:26

廖雪峰python摘录5的相关文章

廖雪峰python摘录4

1.直接作用于for循环的对象统称为可迭代对象:Iterable.    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator. 2.生成器都是Iterator对象,但list.dict.str虽然是Iterable,却不是Iterator. 把list.dict.str等Iterable变成Iterator可以使用iter()函数 3.因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有

廖雪峰python摘录3

1.if判断条件还可以简写x.只要x是非零数值.非空字符串.非空list等,就判断为True,否则为False. 2.这是因为input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数.Python提供了int()函数来完成这件事情: s = input('birth: ') birth = int(s) if birth < 2000: print('00前') else: print('00后') 或者 s>'2000' 也可以,需要类型一致才能比较. 要是i

廖雪峰python摘录7

1.我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性. 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性: 2.使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的. 3.为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法

廖雪峰python摘录二轮2

1 >>> def set_age(self, age): # 定义一个函数作为实例方法 2 ... self.age = age 3 ... 4 >>> from types import MethodType 5 >>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法 6 >>> s.set_age(25) # 调用实例方法 7 >>> s.age # 测试结果 8

廖雪峰python摘录9

1.如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数.注意uname()函数在Windows上不提供,也就是说,os模块的某些函数是跟操作系统相关的.操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中,这一点要注意一下.查看.创建和删除目录可以这么调用.要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把

廖雪峰python 摘录10

1.为了便于程序保存和读取数据,而且,能直接通过条件快速查询到指定的数据,就出现了数据库(Database)这种专门用于集中存储和查询的软件. 2. 在使用SQLite前,我们先要搞清楚几个概念: 表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,比如学生的表,班级的表,学校的表,等等.表和表之间通过外键关联. 要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection: 连接到数据库后,需要打开游标,称之为Cursor,通过Cursor执行SQL语句,然后,获

廖雪峰python摘录8

1.以高级语言通常都内置了一套try...except...finally...的错误处理机制,Python也不例外.我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕. 2.由于没有错误发生,所以except语句块不会被执行,但是finally如果有,则一定会被执行(可以没有finally语句). 3.Py

廖雪峰python摘录6

1 def now(): 2 print('hello') 3 4 import functools 5 6 def log(func): 7 @functools.wraps(func) 8 def wrapper(*args,**kw): 9 print('begin call %s():'% func.__name__) 10 func_tmp=func(*args,**kw) 11 print('end call %s():'% func.__name__) 12 return func

学习笔记_廖雪峰&lt;Python 2.7 教程&gt;

进程和线程的基础知识 CPU执行代码是顺序执行, 单核CPU通过让任务交替执行, "模拟"除了多任务并发执行. 真正的多任务并发, 是在多核CPU上, 每个CPU负责执行一个任务. 但实际任务数量远多于CPU核心数量, 所以最终还是操作系统把多任务轮流调度到不同的核心上执行. 进程/线程和物理内存(寄存器)/CPU的关联: 函数调用, 会在栈中分配一块空间, 存放局部变量和参数, 调用结束, 栈空间被释放. 每个线程都有独立的栈, 寄存器. 同一进程里的所有线程共享文件, 代码和数据.