2017-02-25 76 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并从中继承。这将允许您迭代派生类,而不会在重新载入时弄乱继承。