如何扩展Image类?
我想在PIL库中扩展“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")
结果:错误。myOriginal没有“open”这个属性。
我该如何扩展Image类,而不需要重写open()方法呢?
1 个回答
13
根据PIL的作者Fredrik Lundh的说法:
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()