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

héritage multiple

6 réponses
Avatar
card.lemoine
Bonjour,

Je voulais étudier l'héritage multiple à l'aide de Python, que je découvre
et, en partant de l'exemple simple qui consiste à construire une cellule
graphique composée de deux widgets, respectivement de type "label"
et "entry".
Manquant de doc sur le sujet je suis parti de l'héritage simple et j'ai
essayé d'extrapoler. Mais ça ne marche pas. Dans le petit bout de code
ci-dessous l'initialisation du deuxième widget "écrase" celle du premier,
ne tient pas compte de l'incrémentation de colonne dans la méthode, et ne
présente donc que le deuxième widget. Quelqu'un pourrait-il me brancher sur
une doc ou des exemples. Merci d'avance.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Tkinter import *
class Cellule(Label, Entry):
def __init__(self, cadre, item, texte):
self.texte = texte
Label.__init__(self, cadre, text=item)
Entry.__init__(self, cadre)
def Compose(self):
Label.grid(self, sticky=W, padx=5)
Entry.config(self, width=20)
Entry.grid(self, column = 1, sticky = W, padx = 10, pady = 20)
Entry.insert(self, 0, self.texte)
return Entry.get(self)
if __name__ == "__main__":
racine = Tk()
racine.title("-*-")
cel = Cellule(racine, "item", "texte entré")
cel.Compose()
racine.mainloop()

6 réponses

Avatar
hg
card.lemoine wrote:

Merci. C'est très clair et tes propositions correspondent sensiblement à
un essai antérieur. Mais je voulais essayer de pousser un peu le modèle
objet et, concernant l'héritage multiple, j'ai du mal à en percevoir
l'usage. Alain

Eric Brunel wrote:



"Composée de", donc ce n'est pas un héritage, mais une... composition.


Touché





ça me permet entre autres d'avoir deux classes, une de type HIM et l'autre
de type "interne" de partager une troisième classe de type
configuration ... mais bien sût, l'object confi pourrait être passé de
l'une à l'autre.

hg


Avatar
Eric Brunel
On Thu, 25 Jan 2007 11:46:39 +0100, card.lemoine
wrote:

Bonjour,

Je voulais étudier l'héritage multiple à l'aide de Python, que je
découvre
et, en partant de l'exemple simple qui consiste à construire une cellule
graphique composée de deux widgets, respectivement de type "label"
et "entry".


"Composée de", donc ce n'est pas un héritage, mais une... composition.
Chacune de tes cellules comporte à la fois un Label, et une Entry. Si tu
hérites des deux, tu dis que ta cellule *est* à la fois un Label et une
Entry, ce qui n'est pas la même chose du tout. Utilisant moi-même très
rarement l'héritage multiple, je n'ai même pas vraiment d'exemple parlant
dans lequel il pourrait être utile. Je laisse le soin à d'autres d'en
donner s'ils en connaissent.

Manquant de doc sur le sujet je suis parti de l'héritage simple et j'ai
essayé d'extrapoler. Mais ça ne marche pas. Dans le petit bout de code
ci-dessous l'initialisation du deuxième widget "écrase" celle du premier,
ne tient pas compte de l'incrémentation de colonne dans la méthode, et ne
présente donc que le deuxième widget. Quelqu'un pourrait-il me brancher
sur
une doc ou des exemples. Merci d'avance.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Tkinter import *
class Cellule(Label, Entry):


En fait ta cellule doit être un conteneur pour un label et une entry. Ce
type de conteneur existe dans Tkinter: c'est un Frame. Donc:
class Cellule(Frame):

def __init__(self, cadre, item, texte):


Le conteneur passé dans "cadre" ne sert donc plus à rien: l'objet est
lui-même un conteneur. Donc:
def __init__(self, item, texte):

Ca, on laisse:
self.texte = texte


On initialise le cadre, et on crée les composants de la cellule:
Frame.__init__(self)
self.label = Label(self, text=item)
self.entry = Entry(self, width )

Du coup, la méthode Compose ne sert plus à rien. On peut donc remplacer
tout ça:
Label.__init__(self, cadre, text=item)
Entry.__init__(self, cadre)
def Compose(self):
Label.grid(self, sticky=W, padx=5)
Entry.config(self, width )
Entry.grid(self, column = 1, sticky = W, padx = 10, pady = 20)
Entry.insert(self, 0, self.texte)
return Entry.get(self)
par:

self.label.grid(sticky=W, padx=5)
self.entry.grid(column = 1, sticky = W, padx = 10, pady = 20)
self.entry.insert(0, self.texte)

Et pour utiliser ça, on fait donc quelque-chose comme:
if __name__ == "__main__":
racine = Tk()
racine.title("-*-")
cel = Cellule("item", "texte entré")
cel.pack()
racine.mainloop()

Et voilà.

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"

Avatar
Bruno Desthuilliers
On Thu, 25 Jan 2007 11:46:39 +0100, card.lemoine
wrote:

Bonjour,

Je voulais étudier l'héritage multiple à l'aide de Python, que je
découvre
et, en partant de l'exemple simple qui consiste à construire une cellule
graphique composée de deux widgets, respectivement de type "label"
et "entry".


"Composée de", donc ce n'est pas un héritage, mais une... composition.
Chacune de tes cellules comporte à la fois un Label, et une Entry. Si tu
hérites des deux, tu dis que ta cellule *est* à la fois un Label et une
Entry, ce qui n'est pas la même chose du tout.


<aol />

Utilisant moi-même très
rarement l'héritage multiple, je n'ai même pas vraiment d'exemple
parlant dans lequel il pourrait être utile. Je laisse le soin à d'autres
d'en donner s'ils en connaissent.


Essentiellement pour des classes Mixin...


Avatar
Bruno Desthuilliers
Bonjour,

Je voulais étudier l'héritage multiple à l'aide de Python, que je découvre
et, en partant de l'exemple simple qui consiste à construire une cellule
graphique composée de deux widgets, respectivement de type "label"
et "entry".


Comme le signale Eric, ce n'est pas un bon cas d'utilisation de
l'héritage multiple, particulièrement en Python où du fait du typage
dynamique, l'héritage ne concerne quasiment que l'implémentation (ie: il
n'est pas nécessaire pour le polymorphisme).

Dans ton exemple, la solution évidente (et accessoirement le meilleur
choix de conception) est la composition, avec éventuellement délégation
- ce que Python supporte for bien (cf __getattr__ / __setattr__).

Dans mon expérience, en Python, l'héritage multiple est rarement une
bonne idée sauf pour des classes Mixin (classes qui sont destinées à
rajouter un ensemble de fonctionnalités à d'autres classes).

Avatar
card.lemoine
Merci. C'est très clair et tes propositions correspondent sensiblement à un
essai antérieur. Mais je voulais essayer de pousser un peu le modèle objet
et, concernant l'héritage multiple, j'ai du mal à en percevoir l'usage.
Alain

Eric Brunel wrote:



"Composée de", donc ce n'est pas un héritage, mais une... composition.


Touché



Avatar
card.lemoine
Merci. Là je n'ai pas tout compris mais je vais aller y voir.
Alain



Dans ton exemple, la solution évidente (et accessoirement le meilleur
choix de conception) est la composition, avec éventuellement délégation
- ce que Python supporte for bien (cf __getattr__ / __setattr__).

Dans mon expérience, en Python, l'héritage multiple est rarement une
bonne idée sauf pour des classes Mixin (classes qui sont destinées à
rajouter un ensemble de fonctionnalités à d'autres classes).