Как я могу расширить класс изображения? - PullRequest
6 голосов
/ 02 марта 2011

Я хочу расширить класс "Image" в 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")

РЕЗУЛЬТАТ: Error.myOriginal не имеет атрибута "open".

Как расширить класс Image без перезаписи open() метод?

1 Ответ

10 голосов
/ 02 марта 2011

Согласно Фредрику Лунду , автору 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()
...