Skip to main content

Parmi les articles précédents, nous avons poussé la nature et utilise la décoration plus tard, et a également appris son utilisation de base, suffisamment de 30% de la scène . Cependant, il y a toujours 20% des scènes pour utiliser des méthodes de base qui ne peuvent pas être résolues. À ce stade, nous avons besoin de plus en plus de moyens d'utiliser.


Exemple: je veux

de contrôler la fonction de la décoration via un paramètre , ce problème est vraiment populaire. Prenez le temps d'enregistrement, nous savons tous que le temps peut être écrit dans de nombreux formats, tels que ceux-ci pouvant être enregistrés 2020-05-04 ou 20200504, et peut également être enregistré le 04 / 05/2016, s'il enregistre toujours l'horodatage. Par exemple: nous reconnaissons maintenant une décoration de journaux de journal, utilisé pour signer des journaux pour nous, nous souhaitons maintenant contrôler le format horaire des journaux enregistrés, cette demande ne résolve pas en utilisant la décoration la plus simple.

tempsSi vous souhaitez résoudre le problème, vous devez introduire les paramètres, ce qui signifie que nous devons rejoindre les paramètres de la décoration. Mais le problème est de venir, comment ajouter ce paramètre, où est-ce?

Tout d'abord, le paramètre décoratif

Avant d'introduire une utilisation spécifique, examinez le code de décoration:


def mydec(func): @wraps(func) def mywrap(*args, **kw): print('hello this is decorator1') func(*args, **kw) return mywrap @mydecdef helloWorld(): print('hello, world')

@mydec(type_='test')def helloWorld(): print('hello, world')

C'est la décoration la plus simple que nous avons mentionnée la dernière fois. Si nous voulons transmettre un type de paramètre à ce moment, vous pouvez contrôler la sortie de la décoration. Comme ceci:


Nous pouvons penser que vous devriez ajouter un type_ au paramètre MyDec, mais si vous essayez, vous ne pouvez pas rencontrer des erreurs:





@mydecdef hello_world(): pass

cur = mydec(hello_world)cur()

@mydecdef hello_world(*args, **kw): pass

cur = mydec(hello_world)cur(*args, **kw)

@mydec(type_='test')def helloWorld(): print('hello, world')cur = mydec(hello_world, type_)cur()

cur1 = mydec(type_)cur2 = cur1(hello_world)cur2()

] def mydec(type_=None): def decorate(func): @wraps(func) def mywrap(): if type_ is not None: print(type_) func() return mywrap return decorate Le sens significatif de l'erreur est bien compris, mais la raison est un déroutant. Cette erreur est la fonction MYDEC
Moins de paramètres doit sélectionner ce func est la fonction que nous avons à packer, mais ce n'est pas automatique, comment pouvons-nous nous rappeler moins que ce paramètre?
La nature de ce problème ne peut pas être comprise, la décoration est difficile à atteindre, car ne comprenez que cela, de comprendre l'utilisation habituelle avancée de la décoration arrière. Mais très fosses, plus d'informations recommande simplement comment elle est utilisée et explorant rarement les raisons qui l'appuient, cela donnera aux débutants à comprendre. J'ai également passé beaucoup d'esprit quand j'étudiais, j'ai finalement expliqué clairement, disant que c'était très simple, mais ce n'était pas facile. En fait, cela signalera la principale raison pour laquelle il existe un paramètre dans les légendes. La décoration décorative est complètement différente.

Considérons l'utilisation de décorations inégalées, telles que:

lorsqu'il a effectué hello_world (), équivalent à la mise en œuvre de MyDec (Hello_World) (). Regardez, nous devons commencer cette ligne de code, c'est vraiment le résultat des deux lignes de code suivantes:



Quel est le paramètre sur cette fonction?

quand eMise en œuvre, c'est vraiment comme ça:
Après cette compréhension, nous continuons de descendre, nous voulons maintenant qu'un paramètre passe à la décoration, selon nos idées, les deux codes suivants seront les mêmes. cur = mydec(hello_world)cur(*args, **kw)

Mais malheureusement, les interprètes de Python ne sont pas conçus. Il a créé une classe d'emballage

, qui a été ajouté avec les paramètres
, ce qui signifie que le code suivant est égal au code suivant:

Pour avoir plus de packages, la commande Dans lequel la fonction fonctionnelle et les paramètres sont introduits dans la décoration et la commande sont également différentes. Après avoir compris cela, plus simple, car Python Interprète ajoute une couche lors de l'interprétation des paramètres décoratifs, alors si nous voulons déployer les paramètres, seuls des ensembles décoratifs sont également disponibles dans des décorations. Oui. Par exemple, vous pouvez l'écrire:

afin que nous puissions nous réinscrire: import mathdef pow(x, n): return math.pow(x, n)

lundi, le paramètre par défaut est

def mypow(n): def func(x): return pow(x, n) return func
. que tout est parfait, mais en fait

Il y a un gros problème

, nous sommes ignorés par nous. Ce problème est le problème de paramètre par défaut. Lorsque nous définissons la décoration, placez ce paramètre type_ à l'option. Cela est également compatible avec notre situation réelle, sinon nécessaire, les paramètres peuvent être ignorés. Mais cela a conduit à un problème et certaines personnes n'ont pas à rédiger une reconnaissance avec MyDEC () et certaines personnes utilisées pour écrire MyDEC. Si nous essayons MyDEC, nous constaterons que cela sera rapporté:

Cette erreur est exactement la même que l'erreur ci-dessus, la raison est la même, elle est moins paramètre moins de func. Mais très étrange, pourquoi avez-vous du fonctionnement? from functools import partialpow2 = partial(pow, n=2)pow2(6)
La raison est simple, car nous retirons les supports, la décoration est renvoyée à la structure de deux couches précédente!
Ce sont beaucoup de nids de poule, notre structure décorative n'est pas modifiée, si vous utilisez la structure à deux couches, il n'y a aucun moyen de transmettre les paramètres, mais si vous ne changez pas de changement, vous n'avez que pour forcer le style uniforme duP apprend plus parenthèses? C'est bien sûr une façon, y a-t-il une meilleure façon? Existe-t-il un moyen d'unifier ces deux logiques? def mydec(func=None, type_=None): # 不带参数的话,func会是None,这时候我们固定参数即可 if func is None: return partial(mydec, type_=type_) @wraps(func) def mywrap(): if type_ is not None: print(type_) func() return mywrap

Bien sûr, pour résoudre ce problème, nous devons utiliser un nouvel outil appelé fonction partielle . Fonctionnez une partie très compétente, en fait, c'est aussi une fonction plus élevée, en fait,

Sacs fermés
. L'utilisation d'une fonction partielle est destinée à plusieurs fonctions de paramètres et les valeurs de transmission de certains paramètres peuvent être fixées à l'aide de la fonction partielle, donc agissant comme une fonctionnalisation simple de fonction. Prenons un exemple, nous créons une fonction POW pour calculer n Times of X:

Cette fonction doit transférer les paramètres x et n, si nous ne pouvons que calculer le carré, nous pouvons Utilisez la fermeture, pour modifier les paramètres N , créez une nouvelle fonction pour le faire. Par exemple: L'essence de la fonction partielle est fermée de sorte que NHIl simplifie notre code: Nous n'avons besoin que de transmettre la fonction d'origine à traiter et à corriger les valeurs de paramètre. Nous utilisons la fonction partielle pour résoudre le problème maintenant dans la décoration. Le rappel, la décoration sans paramètres est la fonction à deux couches imbriquée et la courroie est de trois couches imbriquées. Ensuite, nous utilisons une partie, spécifiquement, ajoutons une couche de ligne de collier: Voyons ce détail, lorsque nous ne transmettons pas les paramètres, nous sommes vraiment appliquée est Cur = MyDEC (FUNC). À ce stade, FUNC n'est pas vide, puis la déclaration IF n'est pas activée, il va donc directement commenter MyWrap. Si vous passez les paramètres, cette fois, cette fonction est non, active la partie dans si elle est. Notez que nous sommes dans la partie , il est toujours mydec , ce qui signifie que nous corrigeons cette erreur de paramètre, l'appel est toujours renvoyé comme myWrap, équivalant à la partie supplémentaire des deux couches à travers une partie. Une classe a été fixée pour le casLe nombre et la logique sont unifiés. MARDI Le concept aujourd'hui est plus compliqué que la décoration précédente, peut ne pas comprendre pendant un moment ], en fait, est très normal. Ce n'est pas seulement le problème de la décoration, ce n'est pas seulement le problème de Python, dans l'analyse finale, cela est dû aux caractéristiques de la programmation fonctionnelle. L'avantage de la programmation fonctionnelle est très flexible, très pratique à utiliser, mais les lacunes sont également claires, le code est difficile à maintenir, la lecture est difficile à lire et ce n'est pas simple . Les débutants typiques sont simples et profonds et très difficiles à être typiques. Donc, si vous sentez que vous ne pouvez pas comprendre cela, ce n'est pas votre question. D'une part, nous devons cultiver leurs propres fonctions de programmation, d'autre part, nous devons également nous habituer à utiliser la décoration de Python. Enfin, je connaissais ce sujet. Parce que seul le roi loup et se multiplier, j'ai récemment rejoint le poissonC jeu dur. Quand j'ai commencé à jouer, je me sentais très difficile, souvent des calories, un patron est mort des dizaines d'heures à la maison. Je suis venu plus tard, j'ai lentement trouvé l'astuce, j'ai trouvé que ce genre de jeu et même tous les jeux sont simples. Ce n'est pas seulement moi familier, mais encore plus parce que j'ai commencé à penser à jouer à des jeux et à commencer à réfléchir à ces conceptions de patron? Que devez-vous traiter avec nous? Quelles sont les règles de droit? Pensez plus, avez aussi un pourboire. Une fois que vous en avez plus, de nombreux chefs n'ont la première fois que deux ou trois collections familières, vous pouvez le transmettre. J'ai progressivement découvert beaucoup de choses dans la vie. Comme le patron dans le jeu, seulement difficile . Mais tant qu'il existe un cœur persistant, courageux , apprendre froid et silencieux 智 智 , c'est vraiment un tigre en papier. J'espère vous donner un peu d'inspiration. J'espère que les difficultés devant euxT Tout le monde n'est que des tigres en papier.J'espère que tout le monde peut trouver leur courage.

Sujets