2016-10-29 13 views
0

現在、Python C APIを使用してPython(v3.5)拡張モジュールを作成する方法を学習しています。高速数値作業のようないくつかの操作はC言語で最もよく行われますが、文字列操作のような他の操作はPythonで実装する方がずっと簡単です。 PythonとCの両方のコードを使って新しい型を定義する方法はありますか?PythonとCの両方でPythonクラスを定義する

たとえば、基本ストレージと算術演算をサポートするC言語でMatrixタイプを書いています。私は​​をPythonを使って定義したいと思っています。ここでは文字列の操作がはるかに簡単で、私はcstringについて心配する必要はありません。

私は時にモジュールのロード次のように__init__.py__str__方法を定義しようとしました:

from mymodule._mymodule import Matrix; 

def as_str(self): 
    print("This is a matrix!"); 

Matrix.__str__ = as_str; 

私はこのコードを実行すると、私はTypeError: can't set attributes of built-in/extension type 'matey.Matrix'を取得します。これを行うには許容できる方法がありますか?解決策がMatrixの代わりにサブクラス化される場合は、Cベースクラス/ Pythonサブクラスをモジュール内に整理する最良の方法は何ですか?

答えて

0

個人的には、私はCでオブジェクト指向のものを試してみません。いくつかの(ステートレスな)関数を公開するモジュールを書くことに固執します。

私はPythonインターフェイスをオブジェクト指向にしたければ、Pythonでその(C拡張モジュール)モジュールをインポートして関数を消費するクラスを作成したいと思います。状態の維持はすべてPythonで行われます。

+0

構造体は、おそらく複雑なデータのために有用で来るの伝統的なOOPのアプローチ(例えば行列)で延長_Matrixタイプを定義することができます。見てくださいctypes.Structure – eddiewould

+0

良いアイデア。しかし、私は 'numpy'配列がどのように動作するかをエミュレートしようとしています(実際には私自身の線形代数ルーチンを実際に生産するよりも優れています)。私は前後にコピーするのが遅すぎるので、Cで行列データを保存したいと思います。 –

+0

ええ、私の提案は、行列データを表現するためにC構造体を使用することです。 PythonでこれらのC構造体にアクセスすることはできます。 – eddiewould

0

あなたは代わりにあなたがして

from mymodule._mymodule import _Matrix; 

class Matrix(_Matrix): 
    def __str__(self): 
     return "This is a matrix!" 
関連する問題