理想情况下,我想扩展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))
答案 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
的子类。