2013-02-25 223 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