apprentissage route Python - fermeture et décorateur fonction

De nombreux premiers contacts de partenaire junior du python ne peut pas comprendre ce que les fermetures sont, pourquoi les fermetures, fermetures Qu'utilisez, puis aujourd'hui des blogueurs sur les trois points que nous expliquent la fermeture de python

Tout d'abord, quelle est la fermeture

  • La définition officielle:
    En informatique, les fermetures (Anglais: fermeture), également connu sous le nom des fermetures lexicales (fermeture lexicales) ou une fermeture de fonction (fermetures de fonction), est une référence à la fonction des variables libres. Cette variable libre fait référence et cette fonction existeront ensemble, même si elle a quitté la création d'un environnement ne fait pas exception. Par conséquent, il y a une autre façon de dire que la fermeture est une combinaison d'entités et fonctions qui leur sont associés des références environnementales faites. Les fermetures peuvent avoir plusieurs instances d'exécution, un environnement différent de référence et peuvent générer la même fonction d'une combinaison de différentes instances.

  • Je comprends
    dans une fonction imbriquée d'une fonction, la référence de la fonction et une des variables locales externes dans la fonction, cette fonction est appelée fermeture interne

  • Python bouclages

    la mise en œuvre Python de fermeture en raison de Python est un langage de programmation orienté objet, la fonction ne fait pas exception en Python, en fonction Python aussi comme un objet (objet de fonction) , il est bien en
    dessous de nous regardons un exemple , vous clair:
    Insérer ici l'image Description
    ici , nous définissons d' abord une fonction, nous utilisons des méthodes internes en Python (type), le rôle du type (args) consiste à examiner les paramètres de type args entrants, on peut voir le type de func est un objet de fonction
    nous savons tous que la fonction peut renvoyer des valeurs, de sorte que dans l' objet de la fonction Python ou en tant que valeur de retour, fournissant ainsi la base pour la mise en œuvre des fermetures.

    : Nous examinons ici la réalisation de fermeture Python à l'
    Insérer ici l'image Description
    intérieur où l' on définit d' abord une fonction appelée externe, puis à l' intérieur de cette fonction , nous définissons une variable appelée « out_value », puis à nouveau dans la fonction il définit une fonction interne appelée intérieure et à l'intérieur de la fonction interne que nous avons cité une fonction de la variable externe (externe), de sorte que l' on appelle de la fermeture intérieure

    Nous regardons la fermeture de certaines des propriétés que
    Insérer ici l'image Description
    nous avons appelé et exécuta fonction externe et valeur retournée à la variable f, on peut voir à travers l' impression, la variable de type f en fonction du type, car il est un objet de fonction f nécessairement ' _ Appel _ « (qui est, () est une fonction exécutée après la fonction) attributs et nous examinerons le nom de la variable f, vous pouvez voir que f est un objet de fonction appelée intérieure, pourquoi il en est ainsi parce que la mise en œuvre de la fonction extérieure après l'achèvement, au moment de leur retour , nous allons revenir dans l'objet de fonction interne défini à l' intérieur de la fonction externe, de sorte que le nom de la variable à f intérieur

Maintenant que nous comprenons la mise en œuvre de base dans les fermetures de python, alors laissez - nous regardons quelques exemples:
Insérer ici l'image Description
L'exemple ci - dessus , nous voyons en l'absence de réponses, on devine ce qui va arriver, nous aurions pu quelques petits partenaires ont vu à travers cette transmission de la maladie, le résultat d'un petit partenaire n'a pas vu cette partie de l'esprit n'est pas
0
1
2
? pour que je ne devine ici, en fait, au- dessus de ce résultat est faux, le résultat correct est:
2
2
2
Pourquoi est - ce si?
qui est que dans la fonction extérieure, intérieure par rapport à l'extérieur est juste en fonction de sa définition interne de la portée de la variable i dans la partie extérieure ou au milieu, donc
est pas le intérieur à la fermeture extérieure, par conséquent, le changement peut modifier la valeur de i est la variable interne à l' intérieur i lorsque le dernier cycle est terminé, la valeur de la variable i est i 2 ne changera pas le temps, puis retourne une liste de la fermeture, l'imprimé devraient tous deux

Ensuite , nous pouvons regarder un exemple, si j'ai une demande, le contenu est que je dois avoir une fonction, j'affichons à plusieurs reprises en cours d'appel, si vous comprenez devrait être très facile le partenaire junior iterator à mettre en œuvre lorsque cette fonction est appelée, mais il faut mettre en œuvre cette fonction par voie de fermeture, comment y parvenir.
il peut y avoir un petit partenaire aura les idées suivantes:
Insérer ici l'image Description
mais je regrette de vous dire que cette approche est erronée, nous pouvons souhaiter examiner les résultats:
Insérer ici l'image Description
analyse cause de l'erreur, signifie probablement que la variable locale « cnt » en référence à la cession avant, il nous dit ne peut être imputée après référence parce que la portée de cette variable est dans la fonction externe, comment résoudre ce problème , alors, Python fournit un bon mot réservé utilisé pour déclarer des variables locales (mot - clé nonlocal)
nous examinons la mise en œuvre des résultats révisés:

Insérer ici l'image Description
Après la déclaration nonlocal peut être vu à travers la variable cnt obtenir les résultats que nous voulons

Voici une variable explication processus de fermeture officielle portée:
« » la cellule « Les objets sont référencés par des variables utilisées pour mettre en œuvre la Pour chaque variable multiple Scopes, créée était une cellule à Objet magasin La valeur, chacune des variables Le local. cadre de pile qui fait référence à la valeur contient une référence aux cellules provenant de champs extérieurs qui utilisent aussi cette variable. Lorsque la valeur est atteint , la valeur contenue dans la cellule est utilisée à la place de l'objet de cellule elle - même. Cette de-référence de l'objet de cellule l'octet généré à partir du support nécessite code, ce sont de-référencés Quand ne pas accéder automatiquement à la cellule BE objets SUSCEPTIBLES ne sont pas utiles ailleurs. «
la cellule « les objets référencés par les variables utilisées pour mettre en œuvre plus d'une portée ». Pour chacune de ces variables, un objet de cellule pour créer une valeur stockée; référence une trame de pile variable locale pour chaque valeur comprend une référence à la cellule de l'extérieur de la portée, également en dehors de la portée des variables utilisées. Lorsque la valeur est atteint , la valeur contenue dans la cellule, la cellule plutôt que l'objet lui - même. Annuler objet cellule de référence bytecode besoins de soutien à générer, ces références ne sont pas automatiquement annulées au moment de l' accès. objet cellulaire peu susceptible d'être utile ailleurs.
Donc tout le monde doit comprendre.

En second lieu, pourquoi avoir fermeture

La fermeture évite l'utilisation de variables globales, en outre, la fermeture et permet quelques-unes des données qu'elle opère sur la fonction (environnement) reliés entre eux. Cette programmation orientée objet est très similaire, la surface de la programmation objet, les objets nous permettent de certaines données (propriétés de l'objet) avec une ou plusieurs méthodes associées.

En général, lorsque l'objet est qu'une seule façon, l'utilisation de fermetures est le meilleur choix.
Ici , nous utilisons deux méthodes différentes pour obtenir le même genre de demande, de cette façon , vous pouvez connaître les avantages relativement plus:

La demande: Nous avons un objet numérique nommé Nombre, nous voulons réaliser leur opération d'addition du droit

  1. Pour y parvenir par catégorie:
    Insérer ici l'image Description
  2. Être réalisé avec des fermetures

Insérer ici l'image Description
Nous pouvons voir que peut faire le code lorsque des fermetures de manière à obtenir un plus simple, ce qui est la raison pour laquelle vous souhaitez utiliser des raisons de fermetures.

utilité de fermeture - décorateur

Depuis parler devant tant de fermetures de connaissances et d' applications, puis est ici un regard sur la fermeture de la plus grande utilité en Python, qui est, « décorateur ». En
entendant le nom, vous connaissez le rôle de décorateur, décorateur Eh bien , il est certainement utilisé pour décorer bien, c'est ce qu'il est utilisé pour décorer, en fait, utilisé pour décorer certains des objets dans le Python.
peut - être des petits partenaires avant décorateur compréhension, lorsqu'il est exposé à la classe pour y voir il existe des méthodes de classe au- dessus des symboles spéciaux.
comme Insérer ici l'image Description
mots - clés tels que modifiés par le symbole @ est en fait un décorateur.
si nous allons définir un look simple décorateur:
Insérer ici l'image Description
ce qui précède est notre décorateur personnalisé un décorateur, dans ce qui suit , nous définissons la fonction f nous les utilisons pour décorer décorateur,
nous avons trouvé que dans la fonction originale f « >>>> en cours d' exécution » informations d'impression en ligne, mais après une décoration de décorateur, il imprimer des informations en deux lignes,
est - il pas étonnant, le tout pour une raison, secret maintenant regarder à l' intérieur de ce mystère.
en fait, le rôle du symbole @ ici est de laisser le programme effectue automatiquement une Type de déclaration « f = décorateur (f) » Nous voulons voir savoir: Insérer ici l'image Description
Hey, nous avons constaté que nous définissons la fonction f son nom a été changé pour l'emballage, est -ce pas ce que nous décorateur renvoie la fonction de fermeture Eh bien, combinée avec les connaissances antérieures des fermetures, nous avons constaté que le décorateur est en réalité pas chose si difficile.

Eh bien, regardons quelques-uns des plus sophistiqués décorateur d'approfondir la compréhension:

  1. Avec décorateur de référence:
    Insérer ici l'image Description
    lorsque nous atteignons les arguments ci - dessus passé au décorateur dans la pratique, nous avons pris un nom pour la fonction en cours, puis dans la mise en œuvre de l' imprimer, nous avons constaté que pour une participation de masse, toute notre la fonction imbriquée devient trois, et bien sûr, le décorateur de mécanisme de travail avant sans paramètres sont similaires, un nouveau nom. décorateur avec les paramètres n'étaient plus que f = set_name opérations suivantes lors de l' utilisation de ( "Nick") (f) de sorte qu'il doit comprendre.
  2. Fonction Décorateur avec des paramètres à des questions décorées:
    (1) La première approche: Il est Insérer ici l'image Description
    évident que cette approche est faite de polyvalence décorative est pas forte, si nous avons besoin pour décorer un changement des paramètres de fonction qui se produisent sur notre décorateur ne peut pas être utilisé, ce qui est certainement inacceptable pour nous.
    (1) la deuxième approche:
    Insérer ici l'image Description
    et le même effet que la méthode précédente, mais en utilisant la parcelle et les paramètres des paramètres de participation de masse de colis, polyvalence forte sur le terrain, il est recommandé écrire.

Nous parlons de la première fois de décorateur , nous avons trouvé un problème, et qui est un décorateur de fonction modifiée après le changement de nom de la fonction d' origine a eu lieu, a un nom unique est devenu le nom de la fonction définie par notre décorateur interne, Si je veux toujours le nom de la fonction originale comment le faire, ne vous inquiétez pas là première approche ce qui suit: le
Insérer ici l'image Description
faire est réellement forcé de changer le nom de son sujet, une telle approche , il est certainement pas si élégant, et aussi en Python pas respecté
nous un look plus élégant à la formulation suivante:
Insérer ici l'image Description
cette fois -ci à droite, tout comme papa dit que nous devons utiliser la magie à la magie, décorateurs ici décorateurs pour résoudre le problème, il est plus élégant beaucoup, et
si les partenaires intéressés petits voudront peut -être penser à leur propre functools.wraps pensée atteindre ce décorateur, puis vous mettre en œuvre une fois, je crois que vous apprendre les décorateurs ont un peu d' aide ici entre les raisons d'espace n'expliquent pas la réalisation l'idée.

  1. Utilisez la séquence d'exécution multi-décorateur des
    moments où nous avons besoin de plus d'une fonction étendue décorateurs, comment pouvons - nous écrire, quand une hiérarchie d'appel de fonction décorative avec plusieurs décorateurs ordre entre le décorateur et comment , lisez l'exemple suivant , vous saurez:
    Insérer ici l'image Description
    nous pouvons voir quand nous avions besoin de plus de décorateur décorer, décorateur seulement besoin de se tourner vers le chevauchement, l'ordre du décorateur d'exécution , il est effectué de manière séquentielle d' en haut, c'est pourquoi, nous pourrions combinons dit avant le symbole @ en train de faire les choses en termes de (f = décorateur (f))
    , c'est niché entre plusieurs décorateurs de la relation entre le tableau imbriqué de bas en haut la relation est la suivante :
 f = decorator3(decorator2(decorator1(f)))
  1. Let dernier exemple, nous utilisons le chemin de classe pour obtenir un décorateur regard:
    Insérer ici l'image Description
    pour la classe _ appel _ méthodes ont déjà mentionné ici on ne parle pas, appeler le processus ici devant la première et décorateurs embellissement est procédure d' appel est la même que f = MyDecorator (f) correspondant à un objet f est une classe instanciée par l'MyDecorator out, lorsque l'objet dans l'exécution f f () est déclenché dans un procédé __call__ MyDecorator .

fermetures bien et décorateurs explication a pris fin, le partenaire junior de bienvenue doute poser des questions, discuter des aspects de la connaissance Python ensemble.

Publié 27 articles originaux · louange gagné 62 · vues 10000 +

Je suppose que tu aimes

Origine blog.csdn.net/qq_42359956/article/details/104729796
conseillé
Classement