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

PIL: orienté objet?

3 réponses
Avatar
Mihamina Rakotomandimby
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)
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...

Merci d'avance pour les pistes.

--
Huile Essentielle de Camphre http://www.huile-camphre.fr
Infogerance http://www.infogerance.us
(Serveurs, Postes de travail, Développement logiciel)

3 réponses

Avatar
Bruno Desthuilliers
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).

Avatar
Rakotomandimby (R12y) Mihamina
Bruno Desthuilliers wrote:
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)
???



C'est ce que j'obtiens quand je fais un:
img=MonImage.open()


Sinon, merci pour le reste de l'explication, je comprends mieux


Avatar
bruno.desthuilliers
On 1 juin, 17:02, "Rakotomandimby (R12y) Mihamina"
wrote:
Bruno Desthuilliers wrote:
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)
???



C'est ce que j'obtiens quand je fais un:
img=MonImage.open()


Et en lisant attentivement le traceback, puis en jetant un coup d'oeil
à la doc de PIL, le problème est évident. Puis-je te recommander de
relire ceci:

http://www.pythonware.com/library/pil/handbook/image.htm
"""
The Image module provides a class with the same name which is used to
represent a PIL image. The module also provides a number of factory
functions, including functions to load images from files, and to
create new images.
"""

puis ton traceback ?-)