Mihamina Rakotomandimby a écrit :
Bonjour,
A force d'essayer de dériver PIL.Image et d'échouer, je tombe sur ceci:
http://aspn.activestate.com/ASPN/Mail/Message/image-sig/582313
Ils y disent:
The Image class is just a wrapper for the internal ImagingCore type;
it was never really designed for general subclassing...
Bon, OK... Ce bout de code ne fonctionne pas:
from PIL import Image
class MonImage(Image):
def open(self, une_racine, nom_fichier):
Image.open(nom_fichier)
Si Image.open est une méthode statique ou de classe qui sert de constructeur alternatif, cette instruction ne sert pas à grand-chose... Il devient quoi, l'objet Image que tu viens d'instancier ?
self.calque=Image.open('modele_archi.PNG')
self.convert('RGB')
self.resize(self.calque.size)
self.paste(self.calque, (0,0), self.calque)
self.racine=une_racine
Avec ceci comme traceback
File "/home/mihamina/public_html/ArchiGallery/generate.py",
line 18, in <module>
class MonImage(Image):
TypeError: Error when calling the metaclass bases
module.__init__() takes at most 2 arguments (3 given)
???
Dans mon programme, je ne fais jamais de:
img = Image(...)
Mais toujours des:
img=Image.open('fichier.png')
D'ou la surcharge directe de open().
Comment je peux faire dans mon cas?
>
Il s'agit pour moi de faire des transformations sur les images ouvertes, dès leur ouverture (par open()), le tout uniquement avec des methodes de ma classe dérivée.
Bref, faire "objet" quoi...
Tu a l'air de considérer que "faire objet", c'est utiliser systématiquement l'héritage. Pourtant, si tu y réfléchit bien, l'héritage n'est qu'une forme particulière (et restreinte) de composition/délégation - la classe enfant a une référence sur ses parents et leur délègue (selon le principe du modèle Chaine de responsabilité) ce qu'elle n'implémente pas elle-même. C'est particulièrement évident en Python, où l'instance à une référence (modifiable...) sur son objet class, qui a lui-même une référence (modifiable) sur ses parents et sa metaclasse.
Bref, dans ton cas, ce qui t'intéresse, c'est de réutiliser l'implémentation, et tu le faire sans le mécanisme d'héritage - il suffit de déléguer à un objet Image attribut de ta classe (laquelle n'hérite plus de Image).