Comment python sait si une méthode est "d'origine" ou modifiée ??

Le
Laurent Claessens
Bonjour

J'ai été un peu étonné avec ce code :

+++++++++++++++++++++++++++++++++++++++++

#! /usr/bin/python
# -*- coding: utf8 -*-

class MaClasse(object):
def __init__(self,a):
self.a=a
def methode(self,x):
return self.a+x

def remethode(obj,x):
return obj.a*x

A=MaClasse(2)
A.methode=remethode # LA SUBTILITÉ DU CODE EST ICI
print A.methode(3)
+++++++++++++++++++++++++++
cela m'a retourné :
TypeError: remethode() takes exactly 2 arguments (1 given)

En y pensant, j'ai compris : quand j'écris
A.methore=remethode
alors python fait vraiment que appeller A.methode est la même chose
qu'appeller la fonction remethode.


Mais par ailleurs, python a la convention de mettre self en premier
argument, non ?

Pour autant que j'ai compris python, si je n'avais pas substitué ma
méthode, faire
A.methode(3)
ferait la même chose que
MaClasse.methode(A,3)


Comment fais-je pour modifier le comportement d'une méthode pour
certaines instances d'une classe et pas pour d'aurtes ?


Merci
Bonne aprème
Laurent
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Alex Marandon
Le #23045401
On 23/01/11 19:34, Laurent Claessens wrote:
Comment fais-je pour modifier le comportement d'une méthode pour
certaines instances d'une classe et pas pour d'aurtes ?



En effet assigner simplement la fonction en tant qu'attribut de
l'instance ne suffit pas à la "binder" à ton instance.

Pour cela, une manière de faire est d'appeler la méthode __get__ du
descripteur de la fonction.

mon_instance.methode = remethode.__get__(mon_instance, MaClasse)

Une autre manière moins concise mais aussi sûrement plus lisible:

import types
mon_instance.methode = types.MethodType(remethode, mon_instance,
MaClasse)

Pour plus d'info, voici des explications en anglais:

http://users.rcn.com/python/download/Descriptor.htm (voir la section
Functions and Methods)

PS: note que par convention les noms d'instances commencent généralement
par une minuscule.
(Cf. http://www.python.org/dev/peps/pep-0008/ )
Laurent Claessens
Le #23045541
Une autre mani�re moins concise mais aussi s�rement plus lisible:

import types
mon_instance.methode = types.MethodType(remethode, mon_instance,
MaClasse)



Merci, ça marche bien !


PS: note que par convention les noms d'instances commencent g�n �ralement
par une minuscule.
(Cf. http://www.python.org/dev/peps/pep-0008/ )



À chaque fois que je lis cette page, je souffre énormément, entre
autres parce que je me dis que je devrais me mettre aux espaces au
lieu des TAB ... et modifier en conséquence ma config de vim, ce qui
me prend à chaque fois des heures :(


bonne fin de WE
Laurent
Alex Marandon
Le #23046401
On 23/01/11 21:48, Laurent Claessens wrote:
PS: note que par convention les noms d'instances commencent g�n�ralement
par une minuscule.
(Cf. http://www.python.org/dev/peps/pep-0008/ )



À chaque fois que je lis cette page, je souffre énormément, entre
autres parce que je me dis que je devrais me mettre aux espaces au
lieu des TAB ... et modifier en conséquence ma config de vim, ce qui
me prend à chaque fois des heures :(



Si tu envisages de développer en collaboration avec d'autres personnes,
c'est indispensable à mon avis.

set tabstop=4
set expandtab

et éventuellement :retab pour mettre à jour tes fichiers existants.

Moi, pour éviter d'avoir à reconfigurer Vim sur chaque machine que
j'utilise, je stocke ma conf dans un gestionnaire de code source (en
l'occurence Git). Ainsi si je fais des modifs sur une machine donnée, je
les envoie vers le dépot et je peux les récupérer facilement depuis les
autres machines.
Laurent Claessens
Le #23064701
Si tu envisages de développer en collaboration avec d'autres personnes,
c'est indispensable à mon avis.

set tabstop=4
set expandtab



Merci, je garde ça sous le coude.

et éventuellement :retab pour mettre à jour tes fichiers existants.

Moi, pour éviter d'avoir à reconfigurer Vim sur chaque machine que
j'utilise, je stocke ma conf dans un gestionnaire de code source (en
l'occurence Git). Ainsi si je fais des modifs sur une machine donnée, je
les envoie vers le dépot et je peux les récupérer facilement depuis les
autres machines.



Moi je me ballade avec mon OS et ma /home sur mon disque externe. Donc
j'ai *toutes* mes config sur *tous* les ordinateurs sur lesquels je vais :)
La seule contrainte est évidement d'avoir l'autorisation au TAF à booter
sur son propre OS.

Bon WE
Laurent
Publicité
Poster une réponse
Anonyme