裝飾器
定義:在不改變原有函數的情況下,增加額外的功能。其返回值也是一個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)