我一直在阅读很多以前关于工厂函数等的 SO 讨论,但仍然不知道针对这种特殊情况的最佳(pythonic)方法是什么。我会预先承认我对这个问题施加了一些人为的约束,因为我希望我的解决方案能够在不修改我试图扩展的模块的情况下工作:我可以对其进行修改,但让我们假设它必须保持为-是因为我试图了解这种情况下的最佳实践。
我正在使用http://pypi.python.org/pypi/icalendar模块,该模块处理 Icalendar 规范(以下称为 ical)的解析和序列化。它将文本解析为类似字典的“组件”对象的层次结构,其中每个“组件”都是实现不同有效类型(VCALENDAR、VEVENT 等)的平凡派生类的实例,它们都被吐出来自公共父类的递归工厂:
class Component(...):
@classmethod
def from_ical(cls, ...)
我创建了一个扩展了 ical 'Calendar' 类的 'CalendarFile' 类,其中包括它自己的生成器函数:
class CalendarFile(Calendar):
@classmethod
def from_file(cls, ics):
它打开一个文件 ( ics
) 并将其传递:
instance = cls.from_ical(f.read())
它初始化并修改了一些其他的东西instance
,然后返回它。问题是它instance
最终成为一个Calendar
对象而不是一个CalendarFile
对象,尽管cls
它是CalendarFile
. 没有进入 ical 模块的工厂函数并在那里摆弄,有没有办法将该对象本质上“重铸”为“日历文件”?
我考虑过的替代方案(同样不修改原始模块)是:
- 使
CalendarFile
类成为具有Calendar
类(每个实例创建自己的Calendar
对象的内部实例),但这似乎有条不紊。 - 摆弄返回的对象,为其提供所需的方法(我知道有一个术语用于创建自定义对象,但它让我无法理解)。
- 将附加方法变成函数,并让它们与
Calendar
. - 或者答案可能是我不应该首先尝试从模块继承,而这种类型的代码属于模块本身。
我再次试图了解“最佳”方法是什么,并了解我是否缺少任何替代方法。谢谢。