【问题标题】:Can I treat an instance of one class as an attribute of another我可以将一个类的实例视为另一个类的属性吗
【发布时间】:2012-02-04 14:49:24
【问题描述】:

理想情况下,我想扩展 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))

【问题讨论】:

  • 这是非常基本的 OO 编程 - 查找“has-a”关系以获取存储在属性中的对象示例。 (另外,我很确定 im.self.img 应该是 im.img - 我在第一个版本中得到一个 AttributeError)

标签: python subclass delegation


【解决方案1】:

当然。这与:

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

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

注意是im.bar,而不是im.self.bar

__init__ 中的selfim 相同,因此__init__ 中的self.bar 与外部im.bar 相同。

【讨论】:

  • 感谢您的澄清。 im.bar.upper() - 我没想到会这样!
【解决方案2】:

当然实例可以是类的属性。但是你说你想要一个增强的 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。因此,我的示例只是继承的一般示例。

【讨论】:

  • 我想这样做,但 SO 上的其他帖子引用了 PIL 的作者的话,他说过以下内容:“Image 类并非设计为由应用程序代码子类化。如果您想要自定义行为,请使用委托包装器',因此我会寻找替代品。
【解决方案3】:

在 Python 中,委派、composition、聚合和其他关系之间的界限非常模糊,因为它们都倾向于共享相同的语法,并且垃圾收集没有担心所有权。你怎么称呼它主要取决于你对对象做了什么,即如果 MyImageClass.method_A 只是调用 self.img.method_A() 等,那就是委托。

我很确定您之前已经看到过这一点,因为 Python 中的每个值(包括所有属性的值)都是某种类型的实例。

如果您的类是一个图像,那么您正在寻找继承。你的类应该是Image的子类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多