我正在用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
,但我认为我还没有想到。有人有什么主意吗?
非常感谢你们,新年快乐!!
答案 0 :(得分:1)
您需要注意,数据属性是该类的隐式成员,因此,在将它们分配到某个位置后,该类中的任何方法都可以使用它们。
数据属性不需要声明;像局部变量一样 首次分配给它们时就应运而生。
虽然您的示例可以运行(如果您在Abc.var()
之前调用Abc.func()
),恕我直言,更好的方式是像这样在类级别初始化变量(请注意,我将其命名为{{1} },以避免与方法名称混淆):
val
here和here很好地说明了class Abc:
val = 0
def func(self, *arg):
print(self.val)
def var(self):
self.val = 1
self.func()
关键字的用途。
还请注意,在self
方法内部初始化属性会将其绑定到类实例,而在__init__
方法外部初始化属性将将其绑定到类本身,这是不同的事物(请参阅this discussion)。