我可以将一个类的实例视为另一个类的属性

时间:2012-01-06 22:17:16

标签: python subclass delegation

理想情况下,我想扩展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 个答案:

答案 0 :(得分:1)

不确定。这与以下情况没有什么不同:

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相同。

答案 1 :(得分:1)

当然,实例可以是类的属性。但是你说你想要一个增强的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指出Image isn't designed to be subclassed by application code。因此,我的例子只是继承的一般例子。

答案 2 :(得分:0)

在Python中,委托,composition,聚合和其他之间的界限有一个的复制非常模糊,因为它们都倾向于共享相同的语法,并且那里有垃圾收集不担心所有权。你所谓的它将主要取决于你对对象做了什么,即如果MyImageClass.method_A只调用self.img.method_A()等,它将被委托。

我很确定你以前见过这个,因为Python中的每个值 - 包括所有属性的值 - 都是某种类型的实例。

如果您的班级图片,那么您正在寻找继承。您的类应该是Image的子类。