【发布时间】:2012-11-07 19:02:22
【问题描述】:
如何实现组合模式?我有一个类Container,它有一个属性对象Contained。我想通过简单地调用my_container.some_contained_method() 来重定向/允许从Container 访问Contained 类的所有方法。我是否以正确的方式做正确的事?
我使用类似的东西:
class Container:
def __init__(self):
self.contained = Contained()
def __getattr__(self, item):
if item in self.__dict__: # some overridden
return self.__dict__[item]
else:
return self.contained.__getattr__(item) # redirection
背景:
我正在尝试构建一个类 (Indicator),以增加现有类 (pandas.DataFrame) 的功能。 Indicator 将拥有DataFrame 的所有方法。我可以使用 inheritance,但我遵循“赞成 composition 而不是 inheritance”的建议(例如,请参阅以下答案:python: inheriting or composition )。不继承的一个原因是基类不可序列化,我需要序列化。
我找到了this,但我不确定它是否符合我的需要。
【问题讨论】:
-
代理对象如何帮助您的序列化-您仍然必须以某种方式做到这一点...只需从基础继承(因为您的对象“is-a”)并从那里...
-
一个
pandas.DataFrame有很多方法可以返回另一个DataFrame。可能很难安排您的Container退回另一个Container... -
@Jon 基类不是serializalbe,而是picklable。扩展组件的酸洗比扩展超类更容易。
-
@unutbu,好点子。我想我可以包装每个返回的
DataFrame。
标签: python inheritance pandas composition