2017-05-30 95 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() 

這是一個有點沉重,但工作應該比基於繼承任何解決方案快...