Je travaille avec une classe Python, et je n'ai pas l'accès écrit à sa déclaration.
Comment puis-je joindre une méthode personnalisée (telle que EDIT:
Merci pour toutes vos réponses. Je les ai essayés tous mais ils n'ont pas résolu mon problème. Voici un exemple minimal que j'espère clarifiera le problème. J'utilise Swig pour envelopper une classe C ++, et le but est de remplacer la fonction exemple.cpp strong> p> cmakelists.txt strong> p> pour construire et exécuter test.py, copier tout Les fichiers d'un répertoire, et dans ce répertoire exécutent p> Il en résulte la sortie suivante: p> comme vous Peut voir que l'objet Swig a sa propre fonction __ str __ code> strong>) aux objets créés à partir de cette classe sans modifier la déclaration de classe?
__ str __ code> de objet fort> retourné par le module Swig. J'utilise Cmake pour construire l'exemple: p>
5 Réponses :
>>> class C(object): ... pass ... >>> def spam(self): ... return 'spam' ... >>> C.__str__ = spam >>> print C() spam It won't work on classes which use __slots__.
Malheureusement, cela ne fonctionne pas dans mon cas. La classe que j'essaie de remplacer a été autogogenerated à l'aide de Swig à partir de fichiers d'en-tête C ++.
Créer une sous-classe. Exemple:
Merci pour la suggestion Alex. Il est vrai que je peux facilement créer une sous-classe, mais cela ne m'aidera pas beaucoup parce que l'objet que je travaille est retourné par une fonction que je ne puisse pas modifier. Dans le contexte de votre exemple, l'objet est de type DateTime. Je tiens à remplacer sa fonction __ str __ code>, afin que cela soit utile, j'ai besoin d'un moyen de lancer un objet DateTime à MyDate.
Notez que l'utilisation de la sous-classe d'Alex, vous pouvez vous aider un peu plus d'utiliser " à partir de code> ...
Importer code> ...
comme code> ":
>>> print datetime.now()
'spam'
Si vous créez une classe d'emballage, cela fonctionnera avec une autre classe, soit intégrée ou non. Ceci s'appelle «confinement et délégation», et il s'agit d'une alternative commune à l'héritage:
print sds.split() ['hey', 'ho!']
J'ai utilisé cette technique très tôt dans ma carrière Python pour écrire un intercepteur pour un proxy à un objet Corba distant - le client souhaitait qu'une méthode à distance particulière soit légèrement améliorée, mais sinon tout était de se comporter de la même manière. Ayant seulement récemment passé de la part de C ++, j'étais unghaste à la façon dont peu de code il a fallu pour écrire, par opposition à ce que c ++ aurait fait de moi faire.
Merci Paul! C'est exactement ce que je cherchais.
Le problème avec cette approche est que l'objet emballé résultant n'est pas capable, ce qui est parfois un gros problème
+1. J'ai été surpris que cela ait travaillé pour un objet COM. Je m'attendais à getattr code> échouer.
Ajout de fonctionnalités supplémentaires Ceci est communément appelé décorateur.
L'accès n'est pas toujours i> comme s'il s'agissait de l'objet de base. Par exemple isinstance (s, bassering == true code>, mais
isinstance (sds, bassetruction) == false code>. De même, le
ID () code> et
type () code> Les fonctions renvoient différents résultats.
Est trop pythonique? Existe-t-il une autre suggestion pour un développeur écrit le code des coéquipiers Can-Seul-Lis-Python? Souhaite avoir d'autres ressources pour C ++ à ce terme.
Autre question StackOverflow: stackoverflow.com / Questions / 972 / ...