2011-03-02 17 views
5

Quiero extender la clase de "Imagen" en PIL.¿Cómo puedo extender la clase de imagen?

#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 el atributo "abierto".

¿Cómo puedo extender la clase de imagen sin reescribir el método open()?

+0

No hay método open() en la clase Image.Image!? – mouad

Respuesta

9

According to Fredrik Lundh, el autor de PIL:

la clase La imagen no está diseñado para ser una subclase por código de la aplicación. si desea un comportamiento personalizado, use un contenedor delegante .

myOriginal.py:

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 delegar (casi) todo a self._img, podría utilizar __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() 
Cuestiones relacionadas