在没有继承的情况下在Cython中共享方法实现

时间:2011-09-15 20:31:00

标签: python cython

我的光线跟踪器的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))

1 个答案:

答案 0 :(得分:0)

你的变形很可能成为一种做法。 组成是恕我直言,这是cython代码和架构方面的答案。 请参阅:this article获得一个很好的解释。 IIRC,Blender使用这种架构,因此它看起来与您想要做的完全兼容。 (顺便说一下,你能发一些代码,所以我可以给你一个具体的例子,说明我的想法)。

显然,这取决于代码库的大小以及对它的控制。

相关问题