Могу ли я рассматривать экземпляр одного класса как атрибут другого - PullRequest
0 голосов
/ 07 января 2012

В идеале я хотел бы расширить экземпляр класса изображений PIL, включив в него несколько пользовательских методов;Однако изображение не поддерживает это, поэтому мне нужно сменить тактику.Похоже, что делегирование является наиболее общепринятой альтернативой, но прежде чем я наткнулся на этот аспект python, у меня возникла идея создать свой собственный класс с атрибутом, который функционировал бы как экземпляр класса PIL Image.Я не видел, чтобы это было сделано где-то еще, но это по сути то же самое, что делегирование?

import Image

MyImageClass():
    def __init__(self, filepath):
        self.attrA = ...
        self.attrB = ...
        self.attrc = ...

        self.img = Image.open(filepath)

    def method_A(self):
        ...
    def method_B(self):

im = MyImageClass('/path/to/png')
im.self.img.thumbnail((100,100))

Ответы [ 3 ]

1 голос
/ 07 января 2012

Конечно, экземпляры могут быть атрибутами классов. Но вы говорите, что вам нужен расширенный класс Image - так что расширьте Image:

#take this with a grain of salt - I didn't test the code
from PIL.Image import Image

MyImageClass(Image):
    def __init__(self): 
        super(MyImageClass, self).__init__()

        self.init_some = 'custom_stuff'            

    def method_A(self):
        ...
    def method_B(self):

im = MyImageClass.open('/path/to/png')
im.thumbnail((100,100))

Обновление

Как указано в OP Изображение не рассчитано на создание подкласса кодом приложения . Следовательно, мой пример - просто общий пример для наследования.

1 голос
/ 07 января 2012

Конечно.Это ничем не отличается от:

class Foo(object):
    def __init__(self):
        self.bar = 'test'

im = Foo()
print im.bar.upper()

Обратите внимание, что это im.bar, а не im.self.bar.

self в __init__ совпадает с im, поэтому self.bar в __init__ совпадает с im.bar за ее пределами.

0 голосов
/ 07 января 2012

В Python границы между делегированием, составом , агрегацией и другими имеют повторений довольно размыто, так как все они имеют общий синтаксис и со сборкой мусора нет никаких забот о собственности. То, что вы назовете, будет зависеть главным образом от того, что вы делаете с объектами, то есть, если MyImageClass.method_A просто вызывает self.img.method_A () и т. Д., Это будет делегирование.

Я почти уверен, что вы видели это раньше, так как каждое значение в Python, включая значения всех атрибутов, является экземпляром некоторого типа.

Если ваш класс является изображением, вы ищете наследство. Ваш класс должен быть подклассом Image.

...