3

__cinit__C ++クラスをラップするときにcythonのメソッドをオーバーロードできないという問題に取り組むための標準化された(または一般的に受け入れられている方法)はありますか?

__cinit__*argsと**kwargsにパラメータを含め、__cinit__スコープ内で特定のパターンに従ってC++インスタンスを生成する方法を選択する可能性があります。ただし、このアプローチには複雑な問題があります。

  • 引数に名前を付けてkwargsとして渡さない限り、引数から正しいコンストラクターを識別しようとすると危険な場合があります。これは、ユーザーにとって煩わしいものになる可能性があります。
  • 引数が引数リスト内の型によって呼び出されない場合__cinit__、それらはPythonオブジェクトとして渡されます。私の作業の場合、引数はC ++クラスのPythonラッパーであり、これらのインスタンス「thisptr」を取得しようとすることは、*argsまたは**kwargsからPythonオブジェクトとして渡されるときの悪魔の仕事です。
  • 引数の組み合わせからC++コンストラクターを選択するためにif...elif ... elseケースのシーケンスを使用するという暗黙の必要性は、最終的には非常に厄介になります。

したがって、より良い方法が必要です。1つの方法は、classmethodアプローチを使用することです(例:Pythonで動作をオーバーロードするclassmethodを__init__参照)。それにもかかわらず、私が知る限り(そして私が間違っている場合は訂正してください)、classmethodはクラス名とは異なる名前のメソッドを呼び出すことを意味し、これは1つのクラス名だけでインスタンスを構築するC++の方法とはよく似ていません。

これについて何かアイデアはありますか?

4

1 に答える 1

2

個人的には、classmethodsを使用します。

WrapperClass.fromSpambar(spambar)

それはそのpuzzlinimhoではありませ。C ++で関数をオーバーロードできない場合は、このアプローチにもフォールバックする必要があります。

初期化時にいくつかの重い操作を受け入れることができる場合は、「パターン」などを定義することにより、コンストラクターが呼び出された方法を認識するメソッドを実装できます。つまり、argsとkwargsの正規表現。;)

Pythonオブジェクトからthisptrを取得する問題は見当たりません。

cdef WrapperClass wrpclsi
if isinstance(instance, WrapperClass):
    wrpclsi = instance
else:
    raise TypeError('expected instance of WrapperClass.')

cdef WrappedClassFromCpp* thisptr = wrpclsi.thisptr 
于 2012-06-09T10:31:26.713 に答える