2017-05-30 74 views
1

考虑类自由度,并且其子particleGroup:Numba jitclass:父类类型的类成员

class dof(): 
    def getVar(self): 
     return self.var 

spec = [ 
    ('var', float64[:]), 
    ('C_s', float64[:]),   
] 
@jitclass(spec) 
class particleGroup(dof): 
    def __init__(self, partRelease): 
     self.var = np.array([partRelease.Q, partRelease.M[0], partRelease.M[1], partRelease.M[2], partRelease.B, partRelease.x[0], partRelease.x[1], partRelease.x[2], 0]) 
     self.C_s = np.copy(partRelease.C_s) 
    def getC(self): 
     return self.C_s 

partRelease对象的细节并不重要。

dof是一个python类,因为numba不支持继承jitclass。因此,deferred_type不能用于它。

dof可以是不同儿童班的父母。我希望dof类用于另一个类,在那里我可以调用父函数getVar()

我的问题:如何在另一个类中存储此类(dof类型或任何子类型)的实例?在jitclass规范中指定哪种类型?

然后:即使我可以指定父类的类型,我怀疑对python类的调用会很昂贵。是否有另一种有效地进行多态性的方法,例如使用模板而不是继承?

回答

0

我找到了答案(至少对第二个问题)。

解决方案受模板启发。它由不使用继承组成,但不同的类在其接口中具有所需的通用功能(此处为getVar)。

spec = [ 
('var', float64[:]), 
('C_s', float64[:]),   
] 
@jitclass(spec) 
class particleGroup(): 
    def __init__(self, val, valCs): 
     self.var = np.array([val, val, val, val]) 
     self.C_s = np.array([valCs, valCs*2, valCs*3, valCs*4]) 
    def getC(self): 
     return self.C_s 
    def getVar(self): 
     return self.var 

spec = [ 
    ('var', float64[:]), 
] 
@jitclass(spec) 
class otherDofType(): 
    def __init__(self): 
     self.var = np.array([1.0, 0.0]) 
    def getVar(self): 
     return self.var 

如果一个类想用常用功能的任何类型的对象,它的定义可以被封装在一个函数:

def createUserClass(dofType, dofObject): 
    dof_t = deferred_type() 
    dof_t.define(dofType) 
    spec = [ 
     ('dof', dof_t), 
    ] 
    @jitclass(spec) 
    class UserClass(): 
     def ___init__(self, dof): 
      self.dof = dof 
     def resetVar(self): 
      a = dof.getVar() 
      a[:] = 0 
    return UserClass(dofObject) 

然后我可以使用例如使用UserClass的实例:

particleGroupInstance = particleGroup(6.0, 2.0) 
userObjectParticleGroup = createUserClass(particleGroup.class_type.instance_type, particleGroupInstance) 
userObjectParticleGroup.resetVar() 

otherDofTypeInstance = otherDofType() 
userObjectOtherDofType = createUserClass(otherDofType.class_type.instance_type, otherDofTypeInstance) 
userObjectOtherDofType.resetVar() 

这是一个有点沉重,但工作应该比基于继承任何解决方案快...