【问题标题】:TypeError with multilevel inheritance?具有多级继承的 TypeError?
【发布时间】:2017-02-25 09:12:50
【问题描述】:

我有 4 个不同的课程:

meta
  -> Limb
      -> Arm
      -> Leg

meta 是每个类的基础。肢体继承自元。 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) # 

但是,当我尝试构建 Leg 模块时...

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) 

有人能解释为什么会这样吗?在导入 Arm 模块后导入 Leg 模块时是否会覆盖某些内容,因为它们都继承自 Limb 模块?我在这里有点不知所措。

【问题讨论】:

    标签: python inheritance maya multi-level


    【解决方案1】:

    您可能需要创建一个命名空间,然后它应该可以工作

    import Limb.Arm as limbArm
    reload(limbArm)
    
    import Limb.Leg as limbLeg
    reload(limbLeg) 
    
    
    def build():
        arm = limbArm.Arm()
        leg = limbLeg.Leg()
    
    build()
    

    【讨论】:

    • 不幸的是,这会导致同样的错误。我通过创建 2 个不同的函数来构建 arm 和 leg 并在这些函数中而不是在文件顶部导入 Arm 和 Leg 模块来使其工作。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果不查看您的模块布局,很难知道。但这听起来像您已经反转了类的布局,以便 Limb 被您的导入重新定义。您可能希望像这样组织您的包裹:

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

      使用core.py 中的公共基类。在arm.pylimb.py 中,您将导入core.Limb 并从中继承。这将允许您迭代派生类,而不会在重新加载时弄乱继承。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-28
        • 1970-01-01
        • 2013-02-09
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 1970-01-01
        相关资源
        最近更新 更多