python学习——装饰器&偏函数(5)


前言

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 的作用就是,

把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小唁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值