Py学习  »  Python

python类实例问题(init接受五个参数,只传递两个参数)

AbberantAeons • 4 年前 • 784 次点击  

我一直在研究一个ik/fk关节匹配脚本,上个月我终于成功地得到了正确的工作。今天启动maya,运行脚本,在加载接口时,我收到以下错误

此脚本在运行加载脚本时:

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

点击我的选择根关节链按钮:

# 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' )

有人告诉我,如果在实例化类时将变量传递到类中,只要传递所需的参数,它就可以正常运行,但是在更改之后

def __init__(self, name, *args):

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

我在玛雅加载脚本时收到以下消息

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

第413行是我加载实例的位置…:

left_arm_select = Create_Selection_Chains("left arm")

有人能帮我理解发生了什么事吗?因为我以为我在通过我所有的论点

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38747
 
784 次点击  
文章 [ 2 ]  |  最新文章 4 年前
PySeeker
Reply   •   1 楼
PySeeker    4 年前

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

pylang
Reply   •   2 楼
pylang    4 年前

简而言之,打电话 Create_Selection_Chains(...) 现在还需要三个论点。为什么?

解决方案 :在实例化时传递更多值,例如 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 没有映射到任何内容 Fks , Ikw ikpv 未定义。这将引发一个错误。

代码

将以下内容视为众多选项之一:

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