Maison >développement back-end >Tutoriel Python >Principe du décorateur Python et analyse de son utilisation

Principe du décorateur Python et analyse de son utilisation

不言
不言original
2018-05-02 15:59:202359parcourir

Cet article présente principalement le principe et l'utilisation des décorateurs Python, et analyse les concepts, principes, méthodes d'utilisation et précautions de fonctionnement associées des décorateurs Python sous forme d'exemples. Les amis dans le besoin peuvent se référer à

Ceci. Les exemples d'article décrivent les principes et l'utilisation des décorateurs Python. Partagez-le avec tout le monde pour votre référence, comme suit :

1. L'essence d'un décorateur est une fonction , qui est principalement utilisée pour décorer d'autres fonctions, qui c'est-à-dire Ajouter des fonctions supplémentaires à d'autres fonctions

2 Principes des décorateurs :

(1) Les décorateurs ne peuvent pas modifier le code source du décoré. function

(2) Les décorateurs ne peuvent pas modifier la méthode d'appel de la fonction décorée

3 Réserve de connaissances pour l'implémentation des décorateurs

(1) Les fonctions en Python sont des « variables »

. 🎜>

a. Stockage des variables en Python
x='Tomwenxing'
y=x

[Explication] :

Lorsque l'interpréteur Python rencontre l'instruction x=' Tomwenxing', il accomplit principalement deux tâches :

1. Crée un espace dans la mémoire pour stocker la chaîne 'Tomwenxing'

 2. Créez une variable nommée x dans la mémoire et utilisez-la pour pointer vers l'espace mémoire occupé par la chaîne 'Tomwenxing' (peut être compris comme une relation pièce et pièce)

et l'instruction y=x signifie attribuer la référence de la variable x à la chaîne à la variable y, C'est-à-dire créer une variable y dans la mémoire et la pointer vers l'espace mémoire pointé par la variable x

b, Stockage de fonctions en Python
def test():
  pass

[Explication] :

En Python, le stockage des fonctions est similaire aux variables. Prenez la fonction ci-dessus comme exemple. , Python explique qu'il fait principalement deux choses :

1. Ouvrir un espace mémoire dans la mémoire pour stocker la chaîne du code de la fonction (dans cet exemple le code uniquement a Une phrase : réussir)

 2. Créez une variable test dans la mémoire pour pointer vers l'espace mémoire où la chaîne de code de fonction est stockée (équivalent à test='function body')

Donc en Python, les fonctions sont des variables

(2) Fonction d'ordre supérieur (l'une des deux conditions suivantes est remplie pour être une fonction d'ordre supérieur)

a. une autre fonction

[Impact sur les décorateurs] : Obtenir l'effet « d'ajouter des fonctionnalités à la fonction décorée sans modifier son code source »

import time
def bar():
  time.sleep(2)
  print('in the bar')
def test(func):
  start_time=time.time()
  func()
  stop_time=time.time()
  print('函数的运行时间为:',stop_time-start_time)
test(bar)

Résultat d'exécution :


dans la barre

Le temps d'exécution de la fonction est : 2.0021145343780518

b.

[Impact sur les décorateurs] : obtenir l'effet de « ne pas changer la façon dont la fonction est appelée »

import time
def bar():
  time.sleep(3)
  print('in the bar')
def test2(func):
  print('新添加的功能')
  return func
bar=test2(bar)
bar()

Résultat d'exécution :

Fonctions nouvellement ajoutées
dans la barre

(3) Fonctions imbriquées : utilisez def dans le corps d'une fonction pour déclarer une nouvelle fonction (pas un appel)

def foo():
  print('in the foo')
  def bar(): #声明一个新的函数,而不是调用函数
    print('in the bar')
  bar()
foo()

Résultat d'exécution :

dans le foo
dans la barre

Syntaxe du décorateur : fonction d'ordre supérieur + fonction imbriquée => Décoration. (L'exemple suivant peut être débogué avec le débogueur pycharm pour voir la séquence d'exécution du code)

import time
def timer(func):
  def deco(*args,**kwargs):#使用了不定参数
    start_time=time.time()
    res=func(*args,**kwargs) #运行函数
    stop_time=time.time()
    print('运行时间:',stop_time-start_time)
    return res # 若无返回值,则返回None
  return deco
@timer #等价于test1=timer(test1)=deco,即test1()=deco()
def test1():
  time.sleep(3)
  print('in the test1')
@timer #等价于test2=timer(test2)=deco,即test2(name)=deco(name)
def test2(name):
  time.sleep(3)
  print('in the test2',name)
test1()
print('-------------分界线------------------------')
test2('Tomwenxing')

Résultats d'exécution :

dans le test1
Temps d'exécution : 3.0001718997955322
-------------Ligne limite-----------------------
dans le test2 Tomwenxing
Durée d'exécution : 3.000171422958374

5. Décorateur avec paramètres

# -*- coding:utf-8 -*-
user,passwd='Tomwenxing','123'
#如装饰器带参数,一般是三层嵌套
def auth(auth_type): #第一层的参数是装饰器的参数
  def outer_wrapper(func):#第二层的参数是装饰器要装饰的目标函数
    def wrapper(*args,**kwargs):#第三次的参数是目标函数的参数
      if auth_type=='local':
        username = input('Username:').strip()
        password = input('Password:').strip()
        if user == username and passwd == password:
          print('用户Tomwenxing已经成功登录!')
          res = func(*args, **kwargs) #运行目标函数
          return res
        else:
          exit('用户名或密码有错误')
      elif auth_type=='ldap':
        print('暂不支持这种登录方式!')
    return wrapper
  return outer_wrapper
def index():
  print('欢迎来到index页面')
@auth(auth_type='local') #home=wrapper()
def home(name):
  print('%s,欢迎来到home页面' %name)
  return 'This is home page'
@auth(auth_type='ldap')
def bbs():
  print('欢迎来到bbs页面 ')
index()
print('----------------------分界线-------------------')
print('函数的返回值为:',home('wenxing'))
print('----------------------分界线-------------------')
bbs()

Résultat d'exécution :

Bienvenue sur la page d'index
----------------------Ligne de démarcation------------------
Nom d'utilisateur :Tomwenxing
Mot de passe :123
L'utilisateur Tomwenxing s'est connecté avec succès !
wenxing, bienvenue sur la page d'accueil
La valeur de retour de la fonction est : Ceci est la page d'accueil
---------------------- Ligne de démarcation -------------------
Cette méthode de connexion n'est pas encore prise en charge !

Recommandations associées :

Utilisez Python Decorator pour calculer le temps d'exécution de la fonction

Définition de l'itérateur Python et analyse d'utilisation simple

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