|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 19 ![]() |
Bonjour,
J'ai une classe mère (classe_mere) qui contient 2 fonctions membres (fonction_publique et __fontion_privee), la fonction fonction_publique fait appel à __fontion_privee: Code :
Code :
PS: sinon je vois une autre solution: casser la fonction_publique en trois: une faisant les traitements avant appel de la __fonction_privee, la __fonction_privee, une faisant les traitements après la __fonction_privee et une dernière fonction appelant les trois.... je trouve ça très laid.. y-a-t-il une solution élégante? |
||||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() ![]() Inscription : octobre 2008 Messages : 939 ![]() |
Salut,
D'après l'exemple que tu donnes, la classe fille n'hérite pas de la classe mere, ni de rien d'autre d'ailleurs. Est-ce que cet exemple répond à tes questions: Code :
|
||
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 19 ![]() |
Bonjour, et merci beucoup pour votre réponse.
En effet mon exemple n'était pas très précis, j'ai un peu modifier, et en voici un bien plus précis: Code :
Je suis la fonction private de Main Je suis la fonction private de Main Résultat voulu: Je suis la fonction private de Main Je suis la fonction private de Fille |
||
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : avril 2010 Messages : 19 ![]() |
En effet le résultat est bien conforme à ce que j'ai écris, je le sais bien mais je cherche à le modifier afin obtenir l'autre résultat.
En relisant ton code, j'avoue ne pas comprendre le '_' devant 'public' et en fait tu définies une nouvelle fonction "get_class_name" équivalente à '_public' or dans mon cas je veux éviter de faire cette nouvelle fonction et réutiliser '_public': l'idéal serai de "récupérer" la fonction '_public' afin qu'elle fasse référence à la fonction '__private' de la fonction fille et pas de la fonction 'Main' |
|
|
00
|
|
|
#6 | ||||
|
Membre habitué
![]() Christian HavardDéveloppeur informatique Inscription : mai 2011 Messages : 101 ![]() |
Bonjour,
Aie ! Il est vrai qu'au début programmer en orienté objet demande quelques efforts. Cependant cela en vaut vraiment la peine. Quelque chose m'interpelle dans ton code : Code :
La preuve, le code suivant qui date de l'époque où j'apprenais le Python et qui fonctionne : Code :
|
||||
|
|
00
|
|
|
#7 | |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 697 ![]() |
Citation:
Si vous voulez que les s/classes puissent redéfinir la méthode et qu'elle puisse être appelée, il faudrait que ce soit une méthode "publique" ou "protégée". Avec Python, "public" ou "protégé" n'est que convention (alors que "privé" modifie le chemin d'accès). - W
__________________
Architectures Post-Modernes |
|
|
|
00
|
|
|
#8 | ||||
|
Membre Expert
![]() ![]() Inscription : octobre 2008 Messages : 939 ![]() |
Il faut un GPS pour suivre tes explications.
Le get_class_name() ne sert qu'à la démonstration. Oublions-le. Par contre, lorsque tu fais: Code :
Code :
En général on évite ce genre de construction d'ailleurs. |
||||
|
|
00
|
|
|
#9 | ||
|
Invité de passage
![]() Inscription : avril 2010 Messages : 19 ![]() |
Merci beaucoup!!
En effet j'ai fait plusieurs erreurs, ayant fait du C++ en OO il y a quelque temps j'ai juste besoin de me rafraichir la mémoire et m'adapter à l'OO en python. En effet je me suis fait bloqué par la fonction privée, j'aurai due la déclarée protégée! Et en effet les fonctions protégées n'existe pas en python de ce que j'ai lu: http://docs.python.org/2/reference/l...of-identifiers finalement la solution est assez simple: Code :
Je suis la fonction protégée de Main et j'appel une fonction privée Je suis la fonction protégée de Fille et j'appel une fonction privée J'appel une fonction protégée de la fonction protégée de Fille J'appel une fonction privée privée finalement on peut même forcer la main aux fonctions privées Merci encore ! |
||
|
|
00
|
|
|
#10 | |
|
Invité de passage
![]() Inscription : avril 2010 Messages : 19 ![]() |
Citation:
dans la classe Fille |
|
|
|
00
|
|
|
#11 |
|
Membre habitué
![]() Christian HavardDéveloppeur informatique Inscription : mai 2011 Messages : 101 ![]() |
La méthode __init__, si elle est définie est automatiquement appelée
à l'instanciation d'une classe. En python, lorsqu'on redéfinit une méthode dans une classe fille, celle-ci écrasecelle de la classe mère. Donc si on veut que le code de la classe mère soit quand même exécuté depuis la classe fille, il faut le faire explicitement. Dans le cas de la méthode __init__ cela donne un truc du genre : Ne pas oublier de passer self en argument. Quand on instanciera un objet de la classe Child, tout le code défini dans l'init de la classe mère sera exécuté. Nb : En général, évitez de nommer vos propre méthode __ quelque chose __ sauf quand vous voulez que python les appelle automatiquement dans certaines situations. Ainsi, lorsqu'on crée une méthode __repr__ il faut qu'elle retourne une chaîne de caractères. Celle-ci sera invoquée par la fonction intégrée de python nommée repr. Idem lorsqu'on crée une méthode __str__ qui sera invoquée non seulement par la fonction str(objet) mais aussi par la fonction print(objet). Cela n'a l'air de rien mais c'est particulièrement puissant. En effet, le créateur de la fonction intégrée str par exemple n'a pas à se soucier des types de données qu'elle est censée gérer. Il faut et il suffit que l'objet passé en argument ait une méthode __str__. |
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : avril 2010 Messages : 19 ![]() |
merci pour ces informations, en effet c'est très intéressant et assez puissant !
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com