装饰器
定义:在不改变原有函数的情况下,增加额外的功能。其返回值也是一个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)
本文介绍了Python装饰器的概念,它允许在不修改原函数代码的情况下增加额外功能。内容涵盖装饰器的定义,包括无参数装饰器、带参数装饰器以及通用装饰器的使用方法,并探讨了如何保持装饰后函数的元信息不变。
4536

被折叠的 条评论
为什么被折叠?



