2012-01-06 18 views
0

理想情況下,我想擴展一個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)) 
+5

這是非常基本的OO編程 - 查找存儲在屬性中的對象示例的「has-a」關係。 (另外,我很確定'im.self.img'應該是'im.img' - 我在第一個版本中得到一個AttributeError) – Izkata 2012-01-06 22:23:16

回答

1

當然可以。這只不過是不同的:

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

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

請注意,這是im.bar,不im.self.bar

__init__self相同im所以self.bar__init__相同im.bar以外的它。

+0

感謝您的澄清。 'im.bar.upper()' - 我沒有這樣想過! – 2012-01-06 22:38:18

1

當然,實例可以是類的屬性。但是你說你要增強的圖像類 - 所以延長圖片:

#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指出Image isn't designed to be subclassed by application code。因此,我的例子只是繼承的一個通用示例。

+0

我想這樣做,但是SO上的其他帖子引用了PIL的作者,因爲他說過以下內容:「Image類不是被應用程序代碼設計的子類。如果你想自定義行爲,使用委託包裝',因此我尋找替代品。 – 2012-01-06 22:37:49

0

在Python,邊界beween代表團,composition,聚集和其他 repationships是相當模糊的,因爲它們都往往有着相同的語法,並與垃圾收集沒有關於所有權的擔憂。你所說的將主要取決於你對對象做什麼,即如果MyImageClass.method_A只是調用self.img.method_A()等,它將是委派。

我很肯定你以前見過這個,因爲Python中的每個值 - 包括所有屬性的值 - 都是某種類型的實例。

如果您的類圖片,您正在尋找繼承。你的班級應該是Image的子類。

相關問題