Le remplacement dynamique des attributs au moment de l'exécution est appelé un patch de singe.
Pourquoi s'appelle-t-on patch de singe ?
Le remplacement des attributs à l'exécution n'a rien à voir avec les singes. Il y a deux opinions sur l'origine. de Monkey Patch trouvé en ligne. :
1. Ce mot était à l'origine Guerrilla Patch, une armée diverse et une armée de guérilla, ce qui montre que cette partie n'est pas originale. En anglais, la prononciation de guerilla est similaire à gollia (. orang-outan), et plus tard il a été écrit singe (singe).
2. Une autre explication est que parce que cette méthode gâche le code original (le déranger), elle est appelée Monkeying about (naughty) en anglais, c'est pourquoi elle s'appelle Monkey Patch.
Le nom de Monkey Patch prête un peu à confusion, tant qu'il correspond à la "fonction de remplacement du runtime de module".
Utilisation du patch singe
1. Méthode de remplacement dynamique des modules au moment de l'exécution
stackoverflow Il existe deux exemples populaires ci-dessus
consider a class that has a method get_data. This method does an external lookup (on a database or web API, for example), and various other methods in the class call it. However, in a unit test, you don't want to depend on the external data source - so you dynamically replace the get_data method with a stub that returns some fixed data.
Supposons qu'une classe ait une méthode get_data. Cette méthode effectue certaines requêtes externes (telles que l'interrogation de la base de données ou de l'API Web, etc.), et de nombreuses autres méthodes de la classe l'appellent. Cependant, dans un test unitaire, vous ne souhaitez pas vous fier à des sources de données externes. Vous remplacez donc cette méthode get_data par un état de méthode stupide, qui renvoie simplement quelques données de test.
Un autre exemple cité est l'explication de Monkey Patch sur le wiki Zope :
from SomeOtherProduct.SomeModule import SomeClass def speak(self): return "ook ook eee eee eee!" SomeClass.speak = speak
Il existe également un exemple plus pratique. De nombreux codes utilisent import json. Plus tard, il a été constaté que ujson avait une valeur supérieure. Si vous pensez qu'il est plus coûteux de modifier l'importation json de chaque fichier pour importer ujson en tant que json, ou si vous souhaitez tester si le remplacement de json par ujson est comme prévu, il vous suffit d'ajouter :
import json import ujson def monkey_patch_json(): json.__name__ = 'ujson' json.dumps = ujson.dumps json.loads = ujson.loads monkey_patch_json()
2. Il existe de nombreuses façons d'ajouter dynamiquement des modules pendant l'exécution
Ce scénario est également courant. Par exemple, si nous référençons un module dans la bibliothèque générale de l'équipe et que nous souhaitons enrichir la bibliothèque. fonctions du module, en plus de l'héritage, on peut également envisager d'utiliser Monkey Patch. Personnellement, je pense que si Monkey Patch apporte de la commodité, il risque également de gâcher l'élégance du code source. Site Web PHP chinois, il existe de nombreuxtutoriels vidéo Python gratuits, tout le monde est invité à apprendre !
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!