如何扩展Image类?

8 投票
1 回答
2376 浏览
提问于 2025-04-16 12:48

我想在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()

撰写回答