Maison >développement back-end >Tutoriel Python >Une explication approfondie des décorateurs python

Une explication approfondie des décorateurs python

黄舟
黄舟original
2017-10-01 07:44:051519parcourir

Cet article concerne principalement l'apprentissage des informations pertinentes sur les décorateurs Python d'une manière simple et facile à comprendre. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer à

J'ai déjà entendu parler des décorateurs. mais juste j'en connais un peu, et je ne sais pas comment l'appeler. Je veux juste optimiser le projet en cours, alors j'ai pensé à utiliser des décorateurs, alors j'ai étudié les décorateurs en profondeur

. Jetons d'abord un coup d'œil au code :


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函数....

Mon doute est que ce qui est renvoyé est évidemment un nom de fonction. Logiquement parlant, ce qui est renvoyé est une adresse de fonction. ! Y a-t-il quelque chose qui ne va pas dans ma compréhension ? Ensuite, j'ai vérifié les informations sur Internet, et c'était à nouveau la fermeture.... Mais personnellement, je ne l'aime pas. Ensuite, je l'ai analysé moi-même et j'ai résumé un programme. Après l'avoir lu, vous en connaîtrez la raison
. Programme :


# 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()()) # 调用无参数的嵌套函数...

Cela ne ressemble-t-il pas à notre décoratrice ? C'est notre décorateur ! Par conséquent, nous pouvons le comprendre selon le programme ci-dessus, ce qui signifie qu'il détermine d'abord le nombre de paramètres puis les transmet séparément. Ensuite, nous réécrivons le code :


# 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')

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn