Python- class 实例问题(init 有五个参数;只传递两个)

Python- class instance problem (init takes five arguments; only passing two)

我一直在研究一个 IK/FK 联合匹配脚本,上个月我终于能够正常工作了。今天启动 Maya,运行 脚本,当界面加载时,我收到以下错误…

运行正在加载脚本:

# Error: NameError: file <maya console> line 196: global name 'Fks' is not defined #

点击我的“select根关节链”按钮后的这个:

# Error: NameError: file <maya console> line 1: name 'select_joints_afk' is not defined # 

我对这个很陌生所以我真的不明白到底是怎么回事

class Create_Selection_Chains(object):

    def __init__(self, name, *args):
        self.Fks = Fks
        self.Ikw = Ikw
        self.Pv = ikpv
        self.name = name
        self.combined_selection = self.Fks+self.Ikw+self.Pv
        print("List created"+self.name)

    def select_joints_afk(self):

        if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
            sel = cmds.ls(sl=True)
            fks = sel
            fkCtrls = cmds.listRelatives(sel, allDescendents=True, type=("transform",'nurbsCurve'))
            Fks = [nurbsCurve for nurbsCurve in fkCtrls if nurbsCurve.startswith('FK') & nurbsCurve.endswith('Ctrl')]
            cmds.textFieldButtonGrp(gtF0, edit = True, tx ='' .join(sel),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
            del Fks[1]
            del Fks[2]
            Fks.extend(sel)
            print Fks

            return self.Fks 
        else:
            text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], 
                                        defaultButton='Ok', dismissString='No' )

    def select_joints_aikw(self):

        if cmds.ls(selection = True,type=("transform",'nurbsCurve')):

            sel=cmds.ls(selection = True)
            ikwrist = sel
            Ikw = [nurbsCurve for nurbsCurve in ikwrist if nurbsCurve.startswith('IK') & nurbsCurve.endswith('Ctrl')]
            cmds.textFieldButtonGrp(gtF1, edit = True, tx ='' .join(ikwrist),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))
            cmds.select(ikwrist)
            print Ikw
            return self.ikw
        else:
            text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], defaultButton='Ok', 
                                        dismissString='No' )

    def select_joints_ikpv(self):

        if cmds.ls(selection = True,type=("transform",'nurbsCurve')):
            sel = cmds.ls(sl=True)
            ikPvsel = sel
            ikpv = [nurbsCurve for nurbsCurve in ikPvsel if nurbsCurve.startswith('IK') & nurbsCurve.endswith('Ctrl')]
            cmds.textFieldButtonGrp(gtF2, edit = True, tx ='' .join(ikPvsel),buttonLabel='IK OK',backgroundColor = (.5,.8,.2))        
            cmds.select(ikPvsel)
            print ikpv
            return self.ikpv
        else:
            text = cmds.confirmDialog( title='Error', message='Must select joint', button=['OK'], 
                                        defaultButton='Ok', dismissString='No' )

有人告诉我,如果我在实例化它时将变量传递给 class,只要我传递所需的参数,它应该 运行 没问题,但是在更改

def __init__(self, name, *args):

def __init__(self, name, Fks, Ikw, ikpv):

我在 Maya 中加载我的脚本时收到以下消息

# Error: TypeError: file <maya console> line 413: __init__() takes at least 5 arguments (2 given) #

第 413 行是我加载实例的地方...:[=​​19=]

left_arm_select = Create_Selection_Chains("left arm")

有人可以帮助我了解正在发生的事情吗?因为我以为我在传递我所有的论点

简而言之,调用 Create_Selection_Chains(...) 现在还需要三个参数。为什么?

  • __init__(self, name, Fks, Ikw, ikpv) 需要几个 位置参数 ,即 name, Fks, Ikw, ikpv
  • __init__(self, name, *args): 需要一个 positional argument (name) and 0 to many arbitrary arguments (*args)。

解决方案:在实例化时传入更多值,例如Create_Selection_Chains("left arm", "foo", "bar", "baz")


给定

class Create_Selection_Chains(object):

    def __init__(self, name, *args):
        self.Fks = Fks
        self.Ikw = Ikw
        self.Pv = ikpv
        self.name = name
        ...

您可能已经发现,__init__(self, name, *args) 不起作用,因为 args 未映射到任何内容,并且 FksIkwikpv没有定义。这将引发错误。

代码

考虑以下作为众多选项之一:

class Create_Selection_Chains:

    def __init__(self, name, fks, ikw, ikpv):
        self.name = name
        self.fks = fks
        self.ikw = ikw
        self.pv = ikpv

        ...

最后,在实例化时传入更多的值,例如:

left_arm_select = Create_Selection_Chains("left arm", "foo", "bar", "baz")

*args 是可变的,您的更改不是。 在这里你必须给出你在 init 函数中定义的每个参数。 您可以将其更改为 Fks=some value、IKw=some value 等,使其成为可选参数。