我的光线跟踪器的Python绑定中有几个类实现了.transform()方法(对象,纹理,相机等),它采用了转换矩阵。我想让所有这些类也实现.scale(),. revate()等,并共享调用self.transform(...)的常见实现。一种方法是从提供这些方法及其实现的_Transformable类继承。但Cython“扩展类型”不支持多重继承,因此这对已经继承的类型不起作用。
Cython也不支持cdef类上的装饰器,因此“@_transformable”装饰器也不起作用。而且我认为它们也不支持元类。有什么想法吗?
如果方法可以从全局scale()/ rotate()/ etc继承其文档字符串,则获得积分。函数(返回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))
答案 0 :(得分:0)
你的变形很可能成为一种做法。 组成是恕我直言,这是cython代码和架构方面的答案。 请参阅:this article获得一个很好的解释。 IIRC,Blender使用这种架构,因此它看起来与您想要做的完全兼容。 (顺便说一下,你能发一些代码,所以我可以给你一个具体的例子,说明我的想法)。
显然,这取决于代码库的大小以及对它的控制。