您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 大西几 于 2020-12-17 21:45 编辑
翻译网址:http://blog.duber.cz/3ds-max/an- ... tructs-in-maxscript
水平有限,诸位见谅
我碰到了一个关于结构内部的引用值的问题,这个问题是当需要避免使用全局变量的情况下,在代码中如何使用变量的一个好的解决方案。这里面的问题太多了,因为我不知道在maxscript中的结构的具体实现设计是怎么一回事。
一般而言,相比我们所知的Python语言,结构体只是一个简化的自定义类。但是结构体是如此的简单以至于他都不需要实现继承相关的功能(个人觉得这也是一个遗憾),或者已经实现了一些相比Python中更为强大的功能。结构体他不同于类,他更像是一个组。这就是我使用它的主要原因。我把大量的函数打组并通过一个标准的属性实例范例来调用他们。以下是一个超级简单的结构体,封装了一个函数,用来打印出“HELLO WORLD”。- struct tstStruct(
- fn printHello = (
- print "HELLO WORLD"
- )
- )
点击此处复制文本
你能通过以下的方式来调用这个函数
tstStruct.printHello()
对于大量的函数堆积在一个结构中,而且也没有命名空间或其他的东西参杂在里面,这是一种很方便的访问方式。但是在网站tech-artists.org上读了一篇关于时刻注意避免使用全局变量的文章后,我发现写一些更加清洁优雅和复杂的脚本是很有必要且势在必行的。但是由于我已经习惯了python类,并且我从未使用过结构体内部的变量,我碰到了一个我从未遇到的问题。当你在结构体中声明一个变量的时候,该变量不能直接从该结构的外部访问,而是首先,你必须初始化变量。下面的做法是错的
- struct tstStruct(
- myVar = 0.,
- fn printHello = (
- print "HELLO WORLD"
- )
- )
点击此处复制文本
我简单的以为变量是存在的,并且我可以访问和修改它。但是我错了,你看,在结构体的声明之后访问变量myVar会抛出下面的错误:
-- Unknown property: "myVar" in #Struct:tstStruct(
myVar:<data>,
printHello:<fn>)
为了访问这些变量,我不知道我为什么必须要初始化结构体中的那些变量。问题在于结构体不提供诸如Python中的类似的特殊的方法(函数),例如我不能使用像 __init__ 函数【也就是说报这个错并不是因为maxscript中存在一些被占用的关键字,而使得他的脚本中的变量无法访问】;我抛弃了MAXScript reference文档去读了一些关于如何初始化这些变量的文章,我不得不将struct的值赋给一个新的对象并明确分配给变量,这么做起来非常不方便,但是不管如何,还是有办法可以实现它:- struct tstStruct(
- myVar = 0.,
- fn printHello = (
- print "HELLO WORLD"
- )
- )
- clsInst = tstStruct myVar:0.
点击此处复制文本
这样你就必须调用clsinst对象,才能访问所有函数和显式声明的变量
clsInst.myVar; clsInst.printHello()
现在如我所愿可以正常运行了,我能在我的脚本中使用结构体内部的变量访问和读取了,这是我学到的一个很好的做法。
现在让我们看看这些在python中是如何实现的。Python的类是非常好的,它提供诸如继承,多继承,和一些非常强大的功能和方法。但是在maxscript的结构体和Python的类中还是有一些相似性的,下面我们来看看:
- class tstClass:
- myVar = 0.
- def __init__(self):
- self.testVal = 10.
- def printHello(self):
- print "HELLO WORLD"
点击此处复制文本
上面简单的代码示例声明了一个叫做tstClass的新的类,这个类包含一个变量myVar,一个强制实现的函数 __init__ 和一个自定义函数printHello,在功能上和maxscript是类似的。但是类和结构体之间的相似性体现在——当我直接调用类和访问myVar变量时,我得到了正确的值0.0,因为我还没有初始化类对象并且函数 __init__还没有被执行。相似性就在于类没有被初始化,但是我仍然能访问变量myVar并且Python不会报错。这就是我最初在maxscript中假设的那样。
然而,当我通过给予对象一个新的变量来初始化类时,我通过下面的代码段,执行了__init__函数并使用一个新值10.0覆盖了myVar:- instCls = testClass()
- print testClass.testValprint instCls.testVal
点击此处复制文本
我获得了如下的结果:
0.0
10.0
这就是说没有被初始化的类的myVar值仍然是0.0,但是当类被初始化之后,变量被__init__函数赋予新的值,而变成10.0;可惜maxscript不为其结构体提供这些特殊方法,因而当结构体中存在大量的变量时,初始化结构体显得有点繁琐、不直观、不方便!
编者注:如 Mathieson指出的如下意见,实例化结构体时,你不需要显式访问变量。你真正需要的是保证正确地实例化结构体,然后你就可以访问结构体中的所有变量。再次感谢Mathieson指出的这一点!
|