天天看點

python 裝飾器使用總結

python 裝飾器使用總結

by:授客 QQ:1033553122

測試環境

win10

python 3.5

例1:一個簡單的例子

#!/usr/bin/env python

# -*- coding:utf-8 -*-

__author__ = 'shouke'

def wrapper_method1(func):# func用于接收被裝飾的函數位址

    def wrapper():

        print("執行wrapper_method1")

        func()#調用被裝飾的函數

    return wrapper#傳回方法位址,供執行被裝飾函數前調用

@wrapper_method1#等同于wrapper_method1(myfunction)

def myfuntion():

    print("執行myfunction")

myfuntion()

運作結果:

執行wrapper_method1

執行myfunction

例2:裝飾帶參數函數

def wrapper_method1(func):

    def wrapper(name, age):#這裡的參數清單和myfuntion參數清單保持一緻

        print("執行wrapper_method1 name:%s age:%s" % (name, age))

        func(name, age)#記得給要調用的函數傳遞參數

    return wrapper

@wrapper_method1

def myfuntion(name, age):

     print("執行myfunction name:%s age:%s" % (name, age))

myfuntion('shouke', 'unknow')

執行wrapper_method1 name:shouke age:unknow

執行myfunction name:shouke age:unknow

    def wrapper(*args, **kwargs):

        print("執行wrapper_method1 args:", args)

        func(*args, **kwargs)

def myfuntion(*args,**kwargs):

    print("執行myfunction args:", args)

執行wrapper_method1 args: ('shouke', 'unknow')

執行myfunction args: ('shouke', 'unknow')

例3:函數被多給裝飾器方法裝飾

def wrapper_method2(func):

        print("執行wrapper_method2")

        func()

@wrapper_method2

執行wrapper_method2

說明:裝飾器方法執行順序為從遠到近,從上到下。

例4:在類中使用裝飾器

class MyClass:

    def __init__(self):

    pass

    @staticmethod

    @wrapper_method1

    def myfuntion():

        print("執行myfunction")

MyClass.myfuntion()

例5:裝飾器方法也可以是類函數

class MyClass2:

        def wrapper_method1(func):

        def wrapper(*args, **kwargs):

            print("執行wrapper_method1")

            func(*args, **kwargs)

        pass

    @MyClass2.wrapper_method1

需要注意的點

1、 即便被裝飾函數擁有預設值也要顯示傳遞參數,否則報錯,如下:

    def wrapper(name, age):

        print("執行wrapper_method1 name:%s age:%s" % (name, age))

        func(name, age)

def myfuntion(name='shouke', age='unknow'):

    print("執行myfunction name:%s age:%s" % (name, age))

TypeError: wrapper() missing 2 required positional arguments: 'name' and 'age'

2、 如果被裝飾函數為類的靜态函數時,@staticmethod必須位于最上方,否則報錯,如下:

        print("執行wrapper_method1")

Traceback (most recent call last):

  File "E:/PrivateReops/CassTestManage/TMP/backend/mytest.py", line 34, in <module>

    MyClass.myfuntion()

  File "E:/PrivateReops/CassTestManage/TMP/backend/mytest.py", line 9, in wrapper

    func(*args, **kwargs)

TypeError: 'staticmethod' object is not callable

作者:授客

QQ:1033553122

全國軟體測試QQ交流群:7156436

Git位址:https://gitee.com/ishouke

友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!

作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額随意,您的支援将是我繼續創作的源動力,打賞後如有任何疑問,請聯系我!!!

           微信打賞                       

支付寶打賞                  全國軟體測試交流QQ群  

python 裝飾器使用總結
python 裝飾器使用總結
python 裝飾器使用總結