【问题标题】:Calling a method which uses variables from another method in a class调用使用类中另一个方法的变量的方法
【发布时间】:2026-02-23 21:30:01
【问题描述】:

我正在 Maya 中编写一个脚本并尝试在另一个方法中分配一个变量,而不是像我们通常那样在 __init__ 中分配一个变量。我将窗口命令放在__init__ 中,因此当初始化新实例时,如果我们在__init__ 中分配变量,它将一直运行,而不会为变量分配我想要的值。

例如:

    def __init__(self, windowID = 'selectsomething', title = 'select something'):
        self.windowID = windowID
        self.title = title

        if cmds.window(self.windowID, exists = True):
            cmds.deleteUI(self.windowID)
                    
        myWindow = cmds.window(self.windowID, title = self.title)
        cmds.rowColumnLayout(numberOfColumns = 2, columnWidth = [(1, 300), (2, 100)],
                             columnAttach = [1, 'left', 10], columnSpacing = [1, 10],
                             rowSpacing = [1, 5])
        cmds.button(label = "Apply", command = self.applyButton) #it should print out selected object
        cmds.button(label = "Cancel", command = self.cancelButton)
        cmds.showWindow(myWindow)

        #now for example if I have a sel variable to store selected objects, it would actually return nothing cuz the code ran all the way through and didnt wait for me to select what I needed
        sel = cmds.ls(selection = True) #this will return nothing

我的解决方案是在applyButton 方法中分配变量,该方法将存储我选择的内容。我发现从该方法本身调用一个使用另一个方法的变量的方法有点奇怪。

例如:

class Abc:
    def func(*arg):
        print(self.var)
    
    def var(self):
        self.var = 1
        self.func()
        
abc = Abc()
abc.var()

现在代码运行了,但是调用func 方法听起来不是有点奇怪吗?该方法使用来自var 方法的变量来自var 方法本身?

我还没有看到有人这样做。我的意思是没有类,在函数内部分配的变量保留在该函数内部,我们只能将它与return 一起使用。但是看起来在课堂上我们可以通过在其前添加self. 来使任何内部方法变量全局化?

我的朋友也说我们可以在这种情况下使用@property,但我想我还没弄明白。

【问题讨论】:

  • 不,这一点也不奇怪。这是使用类来封装共享状态的全部意义。请注意,它不是全局的。
  • 嗯,这确实让我感觉好多了,谢谢@juanpa.arrivillaga。你能解释一下“封装共享状态”吗?顺便说一句,当你说“它不是全球性的”时。你的意思是变量实际上属于实例而不是全局?谢谢!!!
  • 您正在使用与实例变量混合的类方法,这可能很奇怪。例如如果你做 Abc().func() 它会失败。但实际上,您可以在任何地方简单地设置一个 self.variable。在大多数情况下,我在 init 中使用 None 对其进行初始化,并在使用它们之前检查它们是否有效。
  • 如果你在一个类中定义了这样的 func(args) 方法,它将成为一个类方法,一个实例方法被定义为你在 var 方法中正确完成的 func(self, args) 。
  • @haggikrey 不,如果你用@classmethod 装饰器装饰它,就定义了一个类方法。 func(*arg) 仍然是一个实例方法;调用实例只是通过arg[0] 而不是名称self 访问。

标签: python class variables methods maya


【解决方案1】:

您需要注意,数据属性 是该类的隐式成员,因此可以在同一类中的任何方法被分配到某个位置后使用。

来自Python documentation

数据属性不需要声明;像局部变量一样,它们 当它们第一次被分配到时就立即存在。

虽然您的示例可以工作(如果您在 Abc.func() 之前调用 Abc.var()),恕我直言,像这样在类级别初始化变量会更好(请注意,我将其称为 val 以避免与方法名):

class Abc:
    val = 0

    def func(self, *arg):
        print(self.val)

    def var(self):
        self.val = 1
        self.func()

self 关键字的用途很好地解释了herehere

还要注意,在__init__ 方法内初始化一个属性会将这个属性绑定到一个类实例,而在__init__ 方法之外初始化它会将它绑定到类本身,这是另一回事(参见@ 987654324@)。

【讨论】:

  • 哦,非常感谢@Gerd,我没有注意到在__init__ 内部和外部初始化属性会产生这样的影响。感谢您提供的信息,对我帮助很大!!!