ファクトリ関数などに関する以前のSOの議論をたくさん読んできましたが、この特定の状況に対する最良の(pythonic)アプローチが何であるかはまだわかりません。拡張しようとしているモジュールを変更せずにソリューションを機能させたいという点で、問題にやや人為的な制約を課していることを前もって認めます。変更を加えることができますが、そのままにしておく必要があると仮定しましょう。 -この状況でのベストプラクティスを理解しようとしているからです。
私はhttp://pypi.python.org/pypi/icalendarモジュールを使用しています。このモジュールは、Icalendar 仕様 (以下、ical) からの解析とシリアル化を処理します。テキストを辞書のような「コンポーネント」オブジェクトの階層に解析します。ここで、すべての「コンポーネント」は、さまざまな有効な 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しまうことです。ical モジュールのファクトリ関数に入ってそこをいじる以外に、そのオブジェクトを「CalendarFile」として本質的に「再キャスト」する方法はありますか?CalendarCalendarFileclsCalendarFile
私が検討した代替案(元のモジュールを変更せずに)は次のとおりです。
- クラスを
CalendarFilehas-aCalendarクラスにします(各インスタンスはオブジェクトの独自の内部インスタンスを作成しCalendarます)が、それは整然としたものに見えます。 - 返されたオブジェクトをいじって、必要なメソッドを提供します(カスタマイズされたオブジェクトを作成するための用語があることは知っていますが、それは私をエスケープします)。
- 追加のメソッドを関数にして、 のインスタンスで動作させるだけです
Calendar。 - または、おそらく答えは、そもそもモジュールからサブクラス化しようとするべきではなく、このタイプのコードはモジュール自体に属しているということです。
繰り返しますが、「最良の」アプローチが何であるかを理解しようとしており、代替案が欠けているかどうかも学びます。ありがとう。