2013-02-25 227 views
0

我在Autodesk Maya中使用Python,但这应该适用于任何地方。Python - 调用另一个类的方法内的函数

我有一个叫bRigUI类,它从被称为wingUtils内部文件的wingUtilities.py

继承另一个类,我可以通过继承得到的self.gPrefix /等名称。但我不知道怎么去的功能那就是类里面的函数内如def cName(txt):

这里是wingUtilities脚本:

import maya.cmds as cmds 

class wingUtils(): 
    def __init__(self): 
     pass 
    def wingUtil(self, *args): 
     self.gPrefix = cmds.textField(self.prefixField, q = True, text = True) 
     self.lPrefix = cmds.textField(self.leftPrefixField, q = True, text = True) 
     self.rPrefix = cmds.textField(self.rightPrefixField, q = True, text = True) 

     def cName(txt): 
      n = self.gPrefix + (txt) 
     def lName(txt): 
      n = self.gPrefix + self.lPrefix + (txt) 
     def rName(txt): 
      n = self.gPrefix + self.rPrefix + (txt) 

w = wingUtils() 

这里是一个非常简单化试图调用它的UI脚本(也是继承的类) - 这个脚本不会工作,它只是一个shell,向你展示我在做什么而没有任何混乱。

import maya.cmds as cmds 
import jtWingRigAutomation.wingUtilities as wingUtilities 

reload(wingUtilities) 

class bRigUI(wingUtilities.wingUtils): 
    def __init__(self): 

     bRigUI = 'bRigUI' 

     if cmds.window(bRigUI, exists = True): 
      cmds.deleteUI(bRigUI) 

      bRigUI = cmds.window('bRigUI', title = 'JT Wing Rig Automation') 
     form = cmds.formLayout() 
     tabs = cmds.tabLayout(innerMarginWidth = 5, innerMarginHeight = 5) 
     cmds.formLayout(form, e = True, attachForm=((tabs, 'top', 0), (tabs, 'left', 0), (tabs, 'bottom', 0), (tabs, 'right', 0))) 

     tab2 = cmds.rowColumnLayout('Wing Setup', parent = tabs) 
     cmds.text(self.naming(), parent = tab2) 

     cmds.showWindow(bRigUI) 
     cmds.window(bRigUI, e = True, w = 250, h = 500) 

b = bRigUI() 

我怎么在UI脚本进入到wingUtils类中的方法中调用该函数cName

回答

4

你不能。 cName是一个局部变量,它只存在于wingUtils.wingUtil的函数上下文中,并且只能通过该函数内的代码进行访问。

+0

这就是为什么声明函数内的功能被认为是拙劣的形式在所有的Python程序员,我知道。最好在课堂上宣布他们,如果你想表明他们打算供私人使用,可能会有前面的_。例如'def _rName(self,txt):' – chmullig 2013-02-25 01:25:42

+0

@chmullig,除非你想创建一个装饰器,否则返回一个函数对象。但在这种情况下,它看起来像是一个缩进错误。 – joojaa 2013-02-25 13:06:50

2

唯一的方法是将内部函数移动到外部范围。你有充分的理由让他们成为内部功能吗?如果是这样,就没有办法做你想做的事。否则,您可能会考虑重写该课程。目前这三个函数cName(),lName()rName()都没有做任何事情,因为没有代码可以从外部调用它们,并且它们不在内部被调用。在这种情况下,它是作为撤消缩进他们,并加入self一样简单:

class wingUtils(): 
    def __init__(self): 
     pass 
    def wingUtil(self, *args): 
     self.gPrefix = cmds.textField(self.prefixField, q = True, text = True) 
     self.lPrefix = cmds.textField(self.leftPrefixField, q = True, text = True) 
     self.rPrefix = cmds.textField(self.rightPrefixField, q = True, text = True) 

    def cName(self, txt): 
     n = self.gPrefix + (txt) 
    def lName(self, txt): 
     n = self.gPrefix + self.lPrefix + (txt) 
    def rName(self, txt): 
     n = self.gPrefix + self.rPrefix + (txt) 
+0

不知道我是否可以设置两个答案是正确的!但是你是对的,就像其他人一样,我应该只是把他们移到外面,我想我能够接近他们,但现在我知道了:) – Vii 2013-02-25 01:36:52