2017-02-13 4 views
0

は、私は新しいこのPyTypeObjectのtp_methods属性に新しいメソッドのおかげで登録することにより、一つのベースタイプのメソッドをオーバーライドし、このガイドPython C API Defining New TypesPython C API、サブタイプから基本型メソッドを呼び出す方法

以下でC APIを使用して1つの既存のPythonのタイプからサブタイプを作成しました。 これは問題なく動作しています。

しかし、コードはまた、私はそれを行う方法についてのドキュメントを見つけることができません。基本型方式(オーバーライドされたものを実行できなければなりません。

任意のアイデアは、感謝

答えて

1
歓迎されています

私は複雑さのために、2.5のオプションは、あると思う:

  1. ちょうどそれを定義するC関数を見つけるCのAPIを使用している場合チャンスはあなたがCで実装された既知のクラスから継承しています。その場合には、メソッドを呼び出してその呼び出しを行います。

  2. は、オブジェクトからクラス、クラスからベースを取得します。 PyObject* baseclass = self->ob_type->tp_base;

    b。 super()のCのAPIに相当使用します

:ベースで

PyObject* baseclass = PyObject_CallFunctionObjArgs(&PySuper_Type,self->ob_type,self,NULL);

をあなたは、関連する機能を得るためにGETATTRのCのAPIと同等のものを使用することができました。

/* check baseclass against null */ 
PyObject* func = PyObject_GetAttrString(baseclass,"function_name"); 
/* check func is not null */ 
PyObject* result = PyObject_CallFunctionObjArgs(self,other_arguments..., NULL); /* adjust arguments here */ 
Py_DECREF(func); 
// decref result? 

別の方法で呼び出すことはできますが、引き数を使ってselfを渡す必要があります。


オプション2bは、複数の拠点をtp_basesによって定義されている場合、それが動作するはずですので、おそらく最も柔軟性があります。

+0

おかげDavidW、 あなたの答えは、ジョブの99%をしました。 私はあなたの提案したコードに少し修正を加えなければならなかったので、私は次の答えに私のコードを投稿します。 –

0

ここに私の作業コードはDavidWの答えから大きく影響を受けています。修飾子は次のとおりです。
1/ob_typeアクセス用のPyObjectポインタへの1/Castサブタイプオブジェクトインスタンス(自己)。 2 /自己の代わりにPyObject_CallFunctionObjArgの最初のパラメータとしてfuncを使用します。

PyObject* baseclass = ((PyObject*)self)->ob_type->tp_base; 
if (baseclass == NULL) {...} 
PyObject* func = PyObject_GetAttrString(baseclass,"sum"); 
if (func == NULL) { ... } 
PyObject* result = PyObject_CallFunctionObjArgs(func,self, NULL); 
Py_DECREF(func); 
+0

Stack Overflowでは、ソリューションが機能する理由を説明することをお勧めします。詳細については、[How To Answer](// stackoverflow.com/help/how-to-answer)を参照してください。 –

関連する問題