社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

AbberantAeons • 5 年前 • 1583 次点击  

我一直在研究一个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
 
1583 次点击  
文章 [ 2 ]  |  最新文章 5 年前
PySeeker
Reply   •   1 楼
PySeeker    5 年前

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

pylang
Reply   •   2 楼
pylang    5 年前

简而言之,打电话 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")