Python裝飾器詳解

2021-10-06 19:42:40 字數 1695 閱讀 5198

裝飾器本質上就是個函式,這個函式接收其它函式作為引數,並將其以乙個新的修改後的函式進行替換。

下面乙個註冊的裝飾器作為例子:

_function = {}

def register(func):

print('func_name is %s,args=%s,kwargs=%s' % (func.__name__, args, kwargs))

return func(*args, **kwargs)

_function[func.__name__] = func

@register

def func1(p1, p2='3'):

print('func1 inner is func1')

print('_function=%s' % _function)

func1('p1', p2='4')

執行結果:

_function=

func_name is func1,args=('p1',),kwargs=

func1 inner is func1

下面看下常用的裝飾器:staticmethod和classmethod

很明顯staticmethod方法是繫結類的所以使用staticmethod可以減少記憶體消耗。

這兩者的區別在於,classmethod增加了乙個對實際呼叫類的引用,這帶來了很多方便的地方:

方法可以判斷出自己是通過基類被呼叫,還是通過某個子類被呼叫

通過子類呼叫時,方法可以返回子類的例項而非基類的例項

通過子類呼叫時,方法可以呼叫子類的其他classmethod

class mytest(object):

def __init__(self, name):

self.name = name

def do_biz1(self):

return self.name

@staticmethod

def do_biz2():

return 'name'

@classmethod

def do_biz3(cls):

return 'name'

print(mytest.__dict__)

do_1_1 = mytest('name').do_biz1

do_1_2 = mytest('name1').do_biz1

print(do_1_1)

print(do_1_1 is do_1_2)

do_2_1 = mytest('name').do_biz2

do_2_2 = mytest('name1').do_biz2

print(do_2_1)

print(do_2_1 is do_2_2)

print(mytest.do_biz2())

do_3_1 = mytest.do_biz3

do_3_2 = mytest.do_biz3

print(do_3_1)

print(do_3_1 is do_3_2)

print(mytest.do_biz3())

輸出結果:

>

false

true

name

>

false

name

python裝飾器 python 裝飾器詳解

def outer x def inner y return x y return inner print outer 6 5 11 如 所示,在outer函式內,又定義了乙個inner函式,並且inner函式又引用了外部函式outer的變數x,這就是乙個閉包了。在輸出時,outer 6 5 第乙個...

python裝飾器詳解 python裝飾器詳解

按照 python 的程式設計原則,當乙個函式被定義後,如要修改或擴充套件其功能應盡量避免直接修改函式定義的 段,否則該函式在其他地方被呼叫時將無法正常執行。因此,當需要修改或擴充套件已被定義的函式的功能而不希望直接修改其 時,可以使用裝飾器。先來看乙個簡單的例子 def func1 functio...

詳解Python裝飾器

裝飾器的難點 在梳理了裝飾器的整個內容之後,我認為難點不是裝飾器本身,而是直接呼叫被裝飾的函式,讓人無法理解背後究竟發生了什麼。一 引出裝飾器概念 引入問題 定義了乙個函式,想在執行時動態的增加功能,又不想改動函式本身的 示例 希望對下列函式呼叫增加log功能,列印出函式呼叫 def f1 x re...