Quiero extender la clase “Imagen” en PIL.
#module Image def open(file): ... class Image: def method1:... def method2:... #module myOriginal from Image import Image class ExtendedImage(Image): def method3:... #module test import myOriginal im = myOriginal.open("picture.jpg")
RESULTADO: Error.myOriginal no tiene ningún atributo “abierto”.
¿Cómo puedo extender la clase de imagen sin reescribir el método open ()?
Según Fredrik Lundh , el autor de PIL:
La clase de imagen no está diseñada para ser subclasificada por el código de la aplicación. Si desea un comportamiento personalizado, utilice un contenedor delegante.
miOriginal.py
Para delegar métodos individuales:
class ExtendedImage(object): def __init__(self,img): self._img=img def method1(self): return self._img.method1() #<-- ExtendedImage delegates to self._img def method3(self): ...
O para delegar (casi) todo a self._img
, puedes usar __getattr__
:
class ExtendedImage(object): def __init__(self,img): self._img=img def __getattr__(self,key): if key == '_img': # http://nedbatchelder.com/blog/201010/surprising_getattr_recursion.html raise AttributeError() return getattr(self._img,key) def method3(self): print('Hiya!')
test.py:
import Image import myOriginal im = myOriginal.ExtendedImage(Image.open("picture.jpg")) im.method3()