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

May 02, 2018 pm 03:59 PM
python 分析 用法

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
Copier après la connexion

[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
Copier après la connexion

[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)
Copier après la connexion

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()
Copier après la connexion

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()
Copier après la connexion

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')
Copier après la connexion

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()
Copier après la connexion

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment intégrer efficacement les services Node.js ou Python sous l'architecture LAMP? Comment intégrer efficacement les services Node.js ou Python sous l'architecture LAMP? Apr 01, 2025 pm 02:48 PM

De nombreux développeurs de sites Web sont confrontés au problème de l'intégration de Node.js ou des services Python sous l'architecture de lampe: la lampe existante (Linux Apache MySQL PHP) a besoin d'un site Web ...

Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Apr 01, 2025 pm 05:09 PM

Solution aux problèmes d'autorisation Lors de la visualisation de la version Python dans Linux Terminal Lorsque vous essayez d'afficher la version Python dans Linux Terminal, entrez Python ...

Quelle est la raison pour laquelle les fichiers de stockage persistants de pipeline ne peuvent pas être écrits lors de l'utilisation du robot Scapy? Quelle est la raison pour laquelle les fichiers de stockage persistants de pipeline ne peuvent pas être écrits lors de l'utilisation du robot Scapy? Apr 01, 2025 pm 04:03 PM

Lorsque vous utilisez Scapy Crawler, la raison pour laquelle les fichiers de stockage persistants ne peuvent pas être écrits? Discussion Lorsque vous apprenez à utiliser Scapy Crawler pour les robots de données, vous rencontrez souvent un ...

Dessin graphique de sablier Python: comment éviter les erreurs variables non définies? Dessin graphique de sablier Python: comment éviter les erreurs variables non définies? Apr 01, 2025 pm 06:27 PM

Précision avec Python: Source de sablier Dessin graphique et vérification d'entrée Cet article résoudra le problème de définition variable rencontré par un novice Python dans le programme de dessin graphique de sablier. Code...

Quelle est la raison pour laquelle le pool de processus Python gère les demandes TCP simultanées et fait coincé le client? Quelle est la raison pour laquelle le pool de processus Python gère les demandes TCP simultanées et fait coincé le client? Apr 01, 2025 pm 04:09 PM

Python Process Pool gère les demandes TCP simultanées qui font coincé le client. Lorsque vous utilisez Python pour la programmation réseau, il est crucial de gérer efficacement les demandes TCP simultanées. ...

Comment afficher les fonctions originales encapsulées en interne par Python Functools.Partial Objet? Comment afficher les fonctions originales encapsulées en interne par Python Functools.Partial Objet? Apr 01, 2025 pm 04:15 PM

Explorez profondément la méthode de visualisation de Python Functools.Partial Objet dans Functools.Partial en utilisant Python ...

Python multiplateform de bureau de bureau de bureau: quelle bibliothèque GUI est la meilleure pour vous? Python multiplateform de bureau de bureau de bureau: quelle bibliothèque GUI est la meilleure pour vous? Apr 01, 2025 pm 05:24 PM

Choix de la bibliothèque de développement d'applications de bureau multiplateforme Python De nombreux développeurs Python souhaitent développer des applications de bureau pouvant s'exécuter sur Windows et Linux Systems ...

Google et AWS fournissent-ils des sources publiques d'image PYPI? Google et AWS fournissent-ils des sources publiques d'image PYPI? Apr 01, 2025 pm 05:15 PM

De nombreux développeurs s'appuient sur PYPI (PythonPackageIndex) ...

See all articles