2017-02-25 39 views
0

我有4個不同的類:具有多級繼承的TypeError?

meta 
    -> Limb 
     -> Arm 
     -> Leg 

元是用於每類的基。肢體繼承元。 Arm和Leg從Limb繼承

Arm.py和Leg.py文件具有完全相同的代碼,只是用於命名約定的一些不同的字符串。

當我做到以下幾點:

import Limb.Arm 
reload(Limb.Arm) 

import Limb.Leg 
reload(Limb.Leg) 


def build(): 
    arm = Limb.Arm.Arm() 

build() 

我得到的錯誤:

# TypeError: unbound method __init__() must be called with Limb instance as first argument (got Arm instance instead) # 

但是,當我嘗試建立的腿模塊...

import Limb.Arm 
reload(Limb.Arm) 

import Limb.Leg 
reload(Limb.Leg) 


def build(): 
    leg= Limb.Leg.Leg() 

build() 

一切工作得很好:

==> SUCCESS: L_Leg created! 

如果我註釋掉這樣加載Leg模塊,代碼也可以很好的運行。

import Limb.Arm 
reload(Limb.Arm) 

#import Limb.Leg 
#reload(Limb.Leg) 

有人可以解釋爲什麼會發生這種情況嗎?導入Arm模塊後導入Leg模塊時是否會覆蓋某些內容,因爲它們都是從Limb模塊繼承的?我在這裏有點損失。

回答

1

你可能需要創建一個命名空間,那麼它應該工作

import Limb.Arm as limbArm 
reload(limbArm) 

import Limb.Leg as limbLeg 
reload(limbLeg) 


def build(): 
    arm = limbArm.Arm() 
    leg = limbLeg.Leg() 

build() 
+0

不幸的是,這導致了相同的錯誤。我通過製作兩種不同的功能來構建手臂和腿部,並將這些功能中的Arm和Leg模塊導入,而不是在文件頂部。 –

1

一些試驗和錯誤後,我想出了這個。我不知道這是做的「正確」的方式,但一些它的工作原理:

def build_leg(): 
    import Limb.Leg 
    reload(Limb.Leg) 

    leg = Limb.Leg.Leg() 

def build_arm(): 
    import Limb.Arm 
    reload(Limb.Arm) 

    arm = Limb.Arm.Arm() 


build_leg() 
build_arm() 
0

這很難知道沒有看到你是如何你由模塊佈局。但是,這聽起來像是你顛倒了類的佈局,以致Limb正在被你的導入重新定義。你可能想要像這樣組織你的包:

limb 
    + core.py 
    + arm.py 
    + leg.py 

與公共基類core.py。在arm.pylimb.py中,您需要導入core.Limb並從中繼承。這將允許您迭代派生類,而不會在重新載入時弄亂繼承。