首頁  >  文章  >  後端開發  >  python裝飾器的深入淺出

python裝飾器的深入淺出

黄舟
黄舟原創
2017-10-01 07:44:051427瀏覽

這篇文章主要和大家一起深入淺出的學習python裝飾器的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

之前就了解到了裝飾器, 但是就會點皮毛, 而且對其調用方式感到迷茫,正好現在的項目我想優化,就想到了用裝飾器, 因此深入研究了下裝飾器.

先看下代碼:


import time


# 将函数作为参数传入到此方法....
def timeif(func):
  def wrapper(arg):
    print("in wrapper() %s" % (arg))
    start = time.clock()
    func(arg)
    end = time.clock()
    print("used: %s %s" % (end-start, arg))
  return wrapper


@timeif
def foo(arg):
  print("in foo() %s" % (arg))


if __name__ == '__main__':
  foo(" Hello ") # 表示执行foo函数....

我的疑惑就是明明return 的是一個函數名,照道理來講,回傳的就是一個函數位址啊!我理解有問題?隨後上網查資料,又是閉包....但是我個人對它不感冒,隨後自己分析,總結出了一段程序,看完你就知道原因了.
程序:


#
# coding=utf-8
# 带参数的函数 返回一个函数地址就行....
def funX(x):
  def funY():
    return x
  return funY


# 不带参数的函数....
def funX1():
  print("调用函数funX1")

  def funY1():
    print("调用函数funY1")
  return funY1


if __name__ == '__main__':
  # print(funX(5)()) # 调用有参数的嵌套函数...
  
  print(funX1()()) # 调用无参数的嵌套函数...

這和我們的裝飾器不像嗎?這就是我們的裝飾器!因此,我們可以按照上面的程式來理解,也就是說它是先確定參數個數,然後分別傳入的,下面,我們來改寫程式碼:


# coding=utf-8
import time


# 将函数作为参数传入到此方法....
def timeif(func):
  def wrapper(arg):
    print("in wrapper() %s" % (arg))
    start = time.clock()
    func(arg)
    end = time.clock()
    print("used: %s %s" % (end-start, arg))
  return wrapper


# @timeif
def foo(arg):
  print("in foo() %s" % (arg))


if __name__ == '__main__':
  timeif(foo)(' Hello')

#

以上是python裝飾器的深入淺出的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn