Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

4 réponses
Avatar
Laurent Claessens
Bonjour

J'ai =E9t=E9 un peu =E9tonn=E9 avec ce code :

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

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

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

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

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

En y pensant, j'ai compris : quand j'=E9cris
A.methore=3Dremethode
alors python fait vraiment que appeller A.methode est la m=EAme 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=E9 ma
m=E9thode, faire
A.methode(3)
ferait la m=EAme chose que
MaClasse.methode(A,3)


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


Merci
Bonne apr=E8me
Laurent

4 réponses

Avatar
Alex Marandon
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/ )
Avatar
Laurent Claessens
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
Avatar
Alex Marandon
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.
Avatar
Laurent Claessens
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