Maison  >  Article  >  développement back-end  >  Analyser l'exemple de code de modification dynamique de la classe Python

Analyser l'exemple de code de modification dynamique de la classe Python

高洛峰
高洛峰original
2017-03-26 10:05:431424parcourir

Cet article présente principalement des informations pertinentes sur les méthodes d'instance modifiées dynamiquement des classes Python. Les amis dans le besoin peuvent se référer à

Méthodes d'instance modifiées dynamiquement des classes Python

I. Je pense que de nombreux amis voudront modifier le code de comportement du programme déjà écrit lors de la programmation, et le moyen le plus courant consiste à utiliser des sous-classes pour réécrire certaines méthodes de la classe parent qui ne répondent pas aux besoins. Par exemple, prenons l'exemple suivant.

class Dog:
  def bark(self):
    print 'Woof!'
 
class Husky(Dog):
  def bark(self)
    print 'Howl!'

Nous pouvons utiliser la méthode ci-dessus pour modifier le code que nous avons écrit, mais comment devons-nous modifier le code tiers ? Bien sûr, nous pouvons également écrire une sous-classe nous-mêmes et appeler l'objet instance de la sous-classe pour implémenter des modifications, mais cela peut introduire une série d'autres problèmes. Nous devons donc trouver un moyen de remplacer la méthode objet d'origine par notre propre méthode. Il s'agit de la méthode "patching" qui sera présentée ensuite dans cet article.

Corriger la classe

Si nous voulons ajouter ou modifier des méthodes objet, le moyen le plus simple est de patcher la classe. En combinant l'exemple ci-dessus, si nous voulons écrire une nouvelle méthode howl pour notre propre classe Dog, nous pouvons définir une nouvelle fonction howl et l'ajouter à notre classe comme le code suivant :

def newbark(self):
  print 'Wrooof!'
 
def howl(self):
  print 'Howl!'
 
# Replace an existing method
Dog.bark = newbark
 
# Add a new method
Dog.howl = howl

Très simple, droite? Mais plusieurs questions requièrent notre attention. Tout d'abord, les méthodes de toutes les instances de la classe modifiée seront mises à jour, de sorte que les méthodes mises à jour existent non seulement dans les objets nouvellement créés, mais que tous les objets créés précédemment auront les méthodes mises à jour, à moins qu'ils ne soient simplement ajoutés plutôt que supprimés. la méthode originale. Deuxièmement, la méthode que vous modifiez ou ajoutez doit être liée à l'objet, donc le premier paramètre de la méthode doit être l'objet appelé (dans ce cas, l'instance de classe self).

Corriger les instances de classe

Les objets individuels peuvent également être corrigés sans affecter les autres instances de cette classe. Mais il existe encore quelques astuces ! Regardons d'abord l'exemple suivant.

def herd(self, sheep):
  self.run()
  self.bark()
  self.run()
 
border_collie = Dog()
border_collie.herd = herd

Essayons ensuite d'appeler la méthode nouvellement définie :

border_collie.herd(sheep)
 
TypeError: herd() takes exactly 2 arguments (1 given)
The problem with the previous code is that the herd is not a bound method, just take a look at the following code:
 
print border_collie.herd
 
<function herd at 0xf9c5f0>

Erreur ! La raison de l'erreur est que l'objet appelé n'est pas transmis comme premier paramètre à la fonction que nous avons écrite. Bien sûr, nous pouvons transmettre les paramètres nous-mêmes, mais cela ne fonctionne pas dans ce scénario de remplacement des méthodes de classe. La bonne solution à ce problème est d'utiliser la fonction MethodType dans le module type. Nous pouvons regarder l'exemple de code suivant :

import types
 
border_collie = Dog()
border_collie.herd = types.MethodType(herd, border_collie)
 
print border_collie.herd
<bound method ?.herd of <__main__.Dog instance at 0x23c9518>>
 
border_collie.herd(sheep)

Maintenant que notre méthode a été liée à l'instance, nous avons terminé !

Résumé

Il est très utile de remplacer ou d'ajouter des méthodes pendant le fonctionnement. Par exemple, dans les tests unitaires, certaines fonctions chargées de communiquer avec les services externes doivent être remplacées. . Pratique pour les tests. Cette technique est non seulement très courante, mais c'est aussi une technique très importante pour garder le code maintenable avant de décider finalement de le modifier.

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