【发布时间】: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