Maya Python静态类函数范围

时间:2017-10-09 16:44:49

标签: maya

我在使静态类工作时遇到了一些麻烦。关于类中函数的范围,我缺少一些东西。如果调用该脚本会给我以下错误:

$timeout(function(){
 $scope.swiperSliders[idcat-1].onResize();
 $scope.swiperSliders[idcat-1].update(true); 
}, 100);

我如何在课堂上定义这些功能?我这样称呼模块:

     NameError: global name 'disableCostumFrames' is not defined #



import maya.cmds as cmds
from functools import partial

class Blast:
    def createWindow():
        # Todo:
        #    hanldes the gui for the user

        windowID = 'window'

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

        window = cmds.window(windowID, title="Blast", iconName='Blast', widthHeight=(400, 200) )
        cmds.frameLayout( label='')

        cmds.rowColumnLayout( numberOfColumns=4, columnWidth=[(1, 100),(3, 100)] )
        cmds.text( label='Start: ' )
        global Blast_startFrame
        Blast_startFrame = cmds.textField( enable = False)
        cmds.text( label=' End: ' )
        global Blast_endFrame
        Blast_endFrame = cmds.textField( enable = False)
        cmds.setParent('..')

        cmds.rowColumnLayout( numberOfColumns=2, columnWidth=[(1, 100), (2, 100)] )
        cmds.radioCollection()
        #cmds.radioButton( label='Full', select = True, onCommand= partial(disableCostumFrames, Blast_startFrame, Blast_endFrame ) )
        #cmds.radioButton( label='Costum', onCommand= partial(enableCostumFrames, Blast_startFrame, Blast_endFrame ) )
        cmds.setParent('..')

        cmds.rowColumnLayout( numberOfColumns=1, columnWidth=[(1, 400), (2, 100)] )   
        cmds.button( label='Playblast' ,command= 'createPlayblast')
        cmds.setParent('..')

        cmds.showWindow( window )

        return Blast_startFrame, Blast_endFrame

    def main():
        createWindow()

    def enableCostumFrames(Blast_startFrame, Blast_endFrame, *args):
        cmds.textField(Blast_startFrame, edit=True, enable=True)
        cmds.textField(Blast_endFrame, edit=True, enable=True)


    def disableCostumFrames(Blast_startFrame, Blast_endFrame, *args):
        cmds.textField(Blast_startFrame, edit=True, text="", enable=False)
        cmds.textField(Blast_endFrame, edit=True, text="", enable=False)

也许我这边做错了什么?感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您需要为类中的所有方法添加self引用。通常的python类看起来像这样:

class MyClass(object):

   def __init__(self):
       self.variable = 123

   def some_method(self):
       print "my variable = ", self.variable

   def some_other_method(self):
       if self.variable > 1:
          self.some_method()

成员函数中的self引用是如何获得类成员变量和其他函数的 - 它是python引用其他语言调用this的方式。

实例方法只能在实例上调用(它是以self传入的实例)。您可以使用@classmethod装饰器创建一个在类本身上调用的方法 - 而不是该类的任何特定实例。类方法也采用了一个参数,但它不是self,而是对类的引用。您可以使用相同的方式获取在类级别定义的变量,这些变量由类的所有副本共享:

class HasShared(object):
    shared = 99

    @classmethod
    def a_class_method(cls):
        print cls.shared

(您可以在同一个类中混合使用类和实例方法)。

您还可以使用@staticmethod装饰器制作静态方法。这些根本没有得到默认参数:

 class NotPythonic(object):

     @staticmethod
     def needs_no_args():
         print "call me as NotPythonic.needs_no_args()"

在Python中,我们倾向于避免使用这个公式,因为你可以通过在模块中创建一个函数来获得一个静态方法而不需要一个类来保存它们。对于你发布的示例代码,我可能只是使用实例方法创建一个常规类,因为你的函数需要gui小部件的名称才能真正问他们问题。