変換行列をとる.transform()メソッド(オブジェクト、テクスチャ、カメラなど)を実装するレイ・トレーサのPythonバインディングにはいくつかのクラスがあります。私はこれらのクラスにすべて.scale()、.rotate()などを実装させ、self.transform(...)を呼び出す一般的な実装を共有したいと思います。これを行う1つの方法は、これらのメソッドとその実装を提供する_Transformableクラスを継承することです。しかし、Cythonの "拡張タイプ"は複数の継承をサポートしていないので、すでに継承しているタイプでは機能しません。継承のないCythonでのメソッド実装の共有
Cythonはcdefクラスのデコレータもサポートしていないため、 "@_transformable"デコレータも動作しません。私は彼らがメタクラスをサポートしているとは思わない。何か案は?
メソッドがグローバルscale()/ rotate()/ etcからdocstringを継承できる場合は、ボーナスポイントを指定します。関数(matriciesを返す)
編集:ここでは何が起こっているかの目安を与えるthe fileの抜粋です:
def translate(*args, **kwargs):
"""
Return a translation.
Accepts the same arguments that Vector(...) does.
"""
return _Matrix(dmnsn_translation_matrix(Vector(*args, **kwargs)._v))
cdef class Pigment:
"""Object surface coloring."""
cdef dmnsn_pigment *_pigment
# ...
def transform(self, Matrix trans not None):
"""Transform a pigment."""
self._pigment.trans = dmnsn_matrix_mul(trans._m, self._pigment.trans)
return self
継承ソリューションは、次のようになります。
cdef class _Transformable:
def scale(self, *args, **kwargs):
return self.transform(scale(*args, **kwargs))
def translate(self, *args, **kwargs):
return self.transform(translate(*args, **kwargs))
def rotate(self, *args, **kwargs):
return self.transform(rotate(*args, **kwargs))
パーマリンクのスペルが間違っています。私は編集を提出しました。 http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/ – forivall