2011-03-02 70 views
5

我想在PIL中擴展「Image」類。如何擴展Image類?

#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") 

結果:Error.myOriginal沒有屬性「open」。

如何在不重寫open()方法的情況下擴展Image類?

+0

類Image.Image!中沒有open()方法嗎? – mouad 2011-03-02 09:06:32

回答

9

According to Fredrik Lundh,PIL的作者:

Image類不旨在被 子類由應用程序代碼。如果您要自定義行爲 ,請使用 委託包裝。

myOriginal.py

委派獨立的方法:

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): 
     ... 

或代表(幾乎)一切self._img,你可以使用__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()