변환 행렬을 사용하는 .transform() 메서드 (Objects, Textures, Cameras 등)를 구현하는 레이 트레이서의 Python 바인딩에 몇 가지 클래스가 있습니다. 이 모든 클래스에 .scale(), .rotate() 등을 구현하고 self.transform (...)을 호출하는 일반적인 구현을 공유하고 싶습니다. 이를 수행하는 한 가지 방법은 해당 메서드와 해당 구현을 제공하는 _Transformable 클래스에서 상속하는 것입니다. 그러나 Cython "확장 유형"은 다중 상속을 지원하지 않으므로 이미 상속 된 유형에서는 작동하지 않습니다.상속없는 Cython에서 메서드 구현 공유
Cython은 cdef 클래스의 데코레이터를 지원하지 않으므로 "@_transformable"데코레이터도 작동하지 않습니다. 그리고 나는 그들이 메타 클래스도지지한다고 생각하지 않는다. 어떤 아이디어?
메소드가 글로벌 scale()/rotate()/etc에서 docstring을 상속 할 수있는 경우 보너스 포인트입니다. 함수 (matricies를 반환).
편집 :
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