1. 程式人生 > >Python裝飾器和偏函式

Python裝飾器和偏函式

裝飾器概念

裝飾器是一個閉包,即輸入一個函式型別的引數並返回一個替代的函式。可以用於拓展原來函式功能,使用python裝飾器的好處就是在不用更改原函式的程式碼前提下給函式增加新的功能。

格式

def outer(func):
    def inner(*args, **kwargs):
        pass
        func(*args, **kwargs)
    return inner

@outer
def funct(args1, args2, ..., argsN):
    pass

簡單的裝飾器

使用f接收裝飾器outer返回的經過擴充套件的函式inner。

def func():
    print("Hello World!")

def outer(func):
    def inner():
        print("********************")
        func()
    return inner

f = outer(func)

複雜裝飾器

def say(name, age):
    print("Hello, My name is %s, I'm %d years old!" % (name, age))

def outer(func):
    def inner(name, age):
        print("**************************")
        func(name, age)
    return inner

say = outer(say)
say(name, age)

使用@outer作用於函式,可以替代say = outer(say)語句,相當於函式定義時就被裝飾器擴充套件。

def outer(func):
    def inner(name, age):
        print("**************************")
        func(name, age)
    return inner

@outer
def say(name, age):
    print("Hello, My name is %s, I'm %d years old!" % (name, age))

say(name, age)

在outer裝飾器中,若inner和func的引數為(*args, **kwargs)則代表可以被接收的任意引數列表。這樣使得該裝飾器對所有的功能函式都通用。

偏函式概念

偏函式是將原函式重新設定部分或全部引數的預設值後,得到的新函式。它與原函式的區別僅在於引數預設值不同。

一個自定義的偏函式int2的例子如下:

def int2(str, base = 2):
    return int(str, base)

print(int("1011"))    # 呼叫原函式(預設十進位制)返回int型別的1011
print(int2("1011"))    # 呼叫偏函式返回int型別的11

python提供一個生成偏函式的模組。通常,通過functools模組定義偏函式,可以簡化程式碼。

import functools
int2 = functools.partial(int, base = 2)    # int引數代表原函式名,base = 2代表需要更改預設值的表示式

print(int2("1011"))    # 偏函式預設2進位制,結果返回11