python 装饰器 运行时动态增加功能

本文介绍了Python装饰器的概念,它允许在不修改原函数代码的情况下增加额外功能。内容涵盖装饰器的定义,包括无参数装饰器、带参数装饰器以及通用装饰器的使用方法,并探讨了如何保持装饰后函数的元信息不变。
部署运行你感兴趣的模型镜像

装饰器

定义:在不改变原有函数的情况下,增加额外的功能。其返回值也是一个python函数。

装饰函数,用于在已经定义好的某一个函数(或代码段)使用时,输入或者操作自己想要的数据。

#一个已有的代码:
def Hello():
    print(' Word!')

函数对象中,可以拿到函数名字的一个属性是:__name__
注意这里是前后两个下划线:._ _name_ _(我将中间放一个空格为了方便看清楚,实际使用时不用中间的空格)

> > > Hello.__name__
> > > 'Hello'
> > > f=Hello
> > > f()
> > > Word!

使用装饰函数,在调用Hello函数时,进行一些操作。

1.装饰器无参数,函数无参数

装饰函数中要把需要被装饰的函数当做参数传进去

def decorator(func):
    print('%s '%func.__name__,end='')
#返回被装饰的函数
    return func

装饰函数来装饰Hello函数

@decorator
def Hello():
    print(' Word!')

打印被装饰好的函数

Hello()

输出: Hello Word!
相当于将这个函数变成:decorator(Hello)

2.装饰器无参数,函数有参数
def decorator(func):
    print('%s'%func.__name__,end='')
    return func
@decorator
def Hello(string):
    print(string,'❤')    
Hello(' python ')

输出:

Yeah!
Hello python  ❤
3.装饰器参数,函数有参数
def decorator(*string):
def func(func):
    print('%s'%string)
    print('%s'%func.__name__,end='')
    return func
return func
@decorator('Yeah!')
def Hello(string):
print(string,'❤') 
Hello(' python ')

输出:

Yeah!
Hello python  ❤
4.通用
def decorator(*string):
    if len(string)>1:
        def func1(func):
            print(string)
            print('%s'%func.__name__,end='')
            return func
        return func1
    else:
        def func2(func):
            print('no string')
            print('%s'%func.__name__,end='')
            return func
        return func2
  • 注意:
    普通的使用装饰器可能会改变原有的函数的部分元值,例如:func.__name__,这个时候可以在装饰器内使用:@wraps这个是python自带的装饰器,可以把原函数的元信息拷贝到装饰器函数中,使得装饰器函数和原函数有一样的元信息。
    例如:

* python -带最小值操作的栈

题目:实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。
你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。

** 注意事项
如果堆栈中没有数字则不能进行min方法的调用

样例
如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1

解法
使用一个列表假代栈,push操作使用列表的插入函数:list.insert(index, obj),参数index代表插入的位置,参数obj代表需要插入的参数。pop操作使用列表的删除函数:del list[index]参数index代表需要删除的位置,删除之前记录列表的第一个元素然后返回。min操作使用列表的最小值函数:min(list)参数list代表列表。使用装饰器来判断栈的大小,如果栈长度>0,则继续操作,如果小于0,则返回False,其中@wraps作用为:把原函数的元信息拷贝到装饰器函数中,使得装饰器函数和原函数有一样的元信息,如此可以使得栈长度>0时,正确返回应该执行的函数。

代码:

# # -*- coding: utf-8 -*-
from functools import wraps
def min0(origin_func):
    @wraps(origin_func)   #把原函数的元信息拷贝到装饰器函数中,使得装饰器函数和原函数有一样的元信息
    def wrapper(self,*args,**kwargs):
        if len(self.zhan):
            return origin_func(self,*args,**kwargs)
        else:
            return False
    return wrapper
class MinStack:

    def __init__(self):
        # do intialization if necessary
        self.zhan=[]

    """
    @param: number: An integer
    @return: nothing
    """


    def push(self, number):
        # write your code here
        self.zhan.insert(0,number)

    """
    @return: An integer
    """

    def pop(self):
        # write your code here
        no0 = self.zhan[0]
        del self.zhan[0]
        return no0

    """
    @return: An integer
    """

    @min0
    def min(self):
        # write your code here

        print('min:self.zhan', self.zhan)
        return min(self.zhan)

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值