多级继承的类型错误?

2024-05-14 11:24:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有4个不同的班级:

meta
  -> Limb
      -> Arm
      -> Leg

元是每个类的基础。肢体从元继承。手臂和腿从肢体继承

那个手臂.py以及腿.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模块,那么代码对于arm也可以正常运行。你知道吗

import Limb.Arm
reload(Limb.Arm)

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

有人能解释为什么会这样吗?在导入手臂模块之后,导入腿部模块时是否会覆盖某些内容,因为它们都继承自肢体模块?我在这里有点不知所措。你知道吗


Tags: 模块instance代码pyimportbuilddefreload
3条回答

您可能需要创建一个名称空间,然后它就可以工作了

import Limb.Arm as limbArm
reload(limbArm)

import Limb.Leg as limbLeg
reload(limbLeg) 


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

build()

很难不看清楚你的模块是如何布置的。但这听起来像是颠倒了类的布局,这样Limb就会被导入重新定义。您可能希望这样组织您的包:

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

core.py中使用公共基类。在arm.pylimb.py中导入core.Limb并从中继承。这将允许您在派生类上迭代,而不会在重新加载时破坏继承。你知道吗

经过反复试验,我想到了这个。我不知道这是不是“正确”的方法,但它确实有效:

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()

相关问题 更多 >

    热门问题