我正在Maya中编写一个脚本,并尝试在另一个方法中分配变量,而不是像我们通常那样在__init__
内部分配变量。我将 window 命令放在__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()
现在代码正在运行,但是从方法本身调用使用var
方法中的变量的func
方法听起来是不是有点奇怪var
?
我还没有看到有人这样做。我的意思是没有类,函数内分配的变量会保留在该函数内,我们只能将其与return
一起使用。但是看起来在类中我们可以通过在它前面添加self.
来使任何内部方法变量全局化?
我的朋友还说我们可以在这种情况下使用@property
,但我想我还没有弄清楚。
您需要注意,数据属性是类的隐式成员,因此在将它们分配到某个位置后,可以由同一类中的任何方法使用。
来自 Python 文档:
数据属性不需要声明;像局部变量一样,它们 当它们第一次被分配到时,就会出现。
虽然您的示例将起作用(如果您在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
关键字的目的在这里和这里得到了很好的解释。
另请注意,在__init__
方法中初始化属性会将此属性绑定到类实例,而在__init__
方法外部初始化属性会将其绑定到类本身,这是另一回事(请参阅此讨论(。