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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章