Python继承仅在init中工作

时间:2013-04-09 22:16:12

标签: python inheritance maya

我最近发布了一个关于继承的问题,但它从来没有得到正确的答案,所以我再试一次。

我这里有这个代码:

import maya.cmds as cmds
import jtAutoRigUI

class RigLegs(jtAutoRigUI.RigUI):
    def __init__(self, *args):
        jtAutoRigUI.RigUI.__init__(self)
        self.rigLegs()

    def rigLegs(self):
        self.items["side"] = "left"
        self.lIK = cmds.duplicate(self.lJoints["hip"], n = self.getName("hip_IK"))
        self.lIK = cmds.listRelatives(self.lIK, ad = True, type = "joint")
        for i in self.lIK:
            newName = i.replace("_JNT", "_IK")
            cmds.rename(i, newName)

这适用于self.items["side"] = "left",因为它是在init方法中声明的。但是在init方法之外声明的任何东西都不会被继承。所以当它到达self.lJoints [“hip”]时就会出错。

class RigUI(object):
    def __init__(self):
        self.widgets = {}
        self.items = {}
        self.items["side"] = "center"
        self.interface()

1 个答案:

答案 0 :(得分:2)

您开始时的错误显然是此行AttributeError上的lJoints

self.lIK = cmds.duplicate(self.lJoints["hip"], n = self.getName("hip_IK"))

让我们忘记你所做的任何模糊描述的任何后来的错误并解决这个问题。

错误告诉您self没有名为lJoints的属性,但您尝试以某种方式修改self.lJoints。 (特别是,你正在调用它的__getitem__方法,但这在这里并不重要。)

既然你已经向我们展示了足够多的代码来看看它是如何初始化的,原因很清楚:你在调用这个函数之前永远不会初始化self.lJoints

让我们追踪它:

首先,RigJoint.__init__()执行此操作:

jtAutoRigUI.RigUI.__init__(self)

现在,RigUI.__init__()执行此操作:

self.widgets = {}
self.items = {}
self.items["side"] = "center"
self.interface()

除非interface方法设置lJoints,否则此时仍未设置。

所以,该函数返回,我们回到RigJoint.__init__(),这样做:

self.rigLegs()

所以,现在我们进入RigJoint.rigLegs()

self.items["side"] = "left"

没有设置self.lJoints

self.lIK = cmds.duplicate(self.lJoints["hip"], n = self.getName("hip_IK"))

并尝试使用不存在的self.lJoints。因此AttributeError


如果您不理解为什么会出现错误,请尝试将其分解为单独的行(在调试时始终是一个很好的步骤):

lJoints = self.lJoints
hip = self.lJoints["hip"]
name = self.getName("hip_IK")
dup = cmds.duplicate(hip, name)
self.lIK = dup

现在您可以看到哪个语句获得异常,它是第一个,它应该比原始复杂语句更容易调试。