前言
python学习笔记 (仅供学习使用)
一、装饰器
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值 也是一个函数对象。 它经常用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝 佳设计。
装饰器的作用就是为已经存在的对象添加额外的功能
def test1(func):#定义额外的功能。
def test2():
print('正在做饭')
func()
print('洗完咯')
return test2
@test1#这就是装饰器
def eat():
print('im eating')
# eat = test1(eat)
eat()
print(eat.__name__)#test2不是eat本身,其实eat就是test2
run:
正在做饭
im eating
洗完咯
2.使用wraps来包装
from functools import wraps
def test1(func):#定义额外的功能。
@wraps(func)#使用func来包装test2
def test2():
print('正在做饭')
func()
print('洗完咯')
return test2
@test1#这就是装饰器
def eat():
print('im eating')
# eat = test1(eat)
eat()
print(eat.__name__)#eat 包装后 eat是eat本身。
3.使用装饰器,完成日志功能
import time
from functools import wraps
def logger(func):
@wraps(func)
def write_logging():
print("[info] --- 日志的时间是:%s"%time.strftime("%H:%M:%S",time.localtime()))
func()
return write_logging
@logger#使用装饰器,给所有的work增加记录日志的功能
def work():
print('im working')
work()
run:
[info] --- 日志的时间是:20:50:21
im working
4.实现work中传多个参数问题
def logger(func):
@wraps(func)
def write_logging(*args,**kwargs):
print("[info] --- 日志的时间是:%s"%time.strftime("%H:%M:%S",time.localtime()))
func(*args,**kwargs)
return write_logging
@logger#实用装饰器,给所有的work增加记录日志的功能
def work():
print('im working')
# work()
''' 1、work2函数可能由多个参数
2、自定义文件的名字和位置,甚至记录日志的级别
'''
@logger#实用装饰器,给所有的work增加记录日志的功能
def work2(name,name2):
# print('{0} and {1} working'.format(name,name2))
print('%s and %s working'%(name, name2))
work2('zhangsan','lisi')
5.实现自定义文件名字和位置
import time
from functools import wraps
def main_logger(log_file = 'out.log'):
def logger(func):
@wraps(func)
def write_logging(*args,**kwargs):
log = "[info] --- 日志的时间是:%s"%time.strftime("%H:%M:%S",time.localtime())
print(log)
with open(log_file,'a') as file:
file.write(log + '\n')
func(*args,**kwargs)
return write_logging
return logger
@main_logger()#实用装饰器,给所有的work增加记录日志的功能
def work():
print('im working')
work()
''' 1、work2函数可能由多个参数
2、自定义文件的名字和位置,甚至记录日志的级别
'''
@main_logger('work.log')#实用装饰器,给所有的work增加记录日志的功能
def work2(name,name2):
# print('{0} and {1} working'.format(name,name2))
print('%s and %s working'%(name, name2))
work2('zhangsan','lisi')
6.使用类完成相应功能
import time
from functools import wraps
''' 使用类来完成相应函数的功能'''
class Logs(object):
def __init__(self,log_file = 'out.log',level = 'info'):
self.log_file = log_file
self.level = level
def __call__(self, func):
@wraps(func)
def write_logging(*args, **kwargs):
log = "[%s] --- 日志的时间是:%s" % (self.level,time.strftime("%H:%M:%S", time.localtime()))
print(log)
with open(self.log_file, 'a') as file:
file.write(log + '\n')
func(*args, **kwargs)
return write_logging
@Logs()#实用装饰器,给所有的work增加记录日志的功能
def work():
print('im working')
# work()
''' 1、work2函数可能由多个参数
2、自定义文件的名字和位置,甚至记录日志的级别
'''
@Logs(log_file='work.log',level='WARNING')#实用装饰器,给所有的work增加记录日志的功能
def work2(name,name2):
# print('{0} and {1} working'.format(name,name2))
print('%s and %s working'%(name, name2))
work2('zhangsan','lisi')
#TypeError: write_logging() takes 0 positional arguments but 1 was given
二、偏函数
Python的 functools 模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。
在介绍函数参数的时候,我们讲到,通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。
import functools
print(int('123'))#默认是按照十进制进行转换的。
print(int('123',base = 8))#83
print(int('123', 8))#83
def int_2(num,base = 2):#实现2进制的转换。
return int(num,base)
print(int_2('1001'))# 9
int_3 = functools.partial(int,base = 2)#zhe里的int_3就是偏函数
print(int_3('1001'))#9
理清了 functools.partial 的作用就是,
把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。