Ros*_*oss 5 python oop wolfram-mathematica
我为Mathematica编写了一个名为MathOO的软件包.简而言之,它允许您在Mathematica中使用面向对象,就像在Python中一样.有关详细信息,请阅读Voofie/MathOO中的以下文章:
MathOO:使用MathOO向Mathematica添加Python风格的对象方向(1.0 beta发布)[Objectica的替代方案]
我遇到的问题是,我想要垃圾收集器,以便用户在使用它之后不必显式删除该对象.例如:
NewClass[Object1]
Object1.$init$[self_]:= Return[];
Run Code Online (Sandbox Code Playgroud)
在上面的两行中,我只是将Object1定义为一个新类,将构造函数定义为一个空函数.如果你熟悉Python,你应该看到它的相似性__init__().
要实例化Object1,我这样做:
object1 = new[Object1][]
Run Code Online (Sandbox Code Playgroud)
输出是:
Out: object$13
Run Code Online (Sandbox Code Playgroud)
这里,对象$ 13是一个临时变量.我想要的是,当没有对这个临时变量的引用时,应该自动删除它.但它没有按预期工作.我已经确定了以下问题:
In: y = Module[{x}, x[1] = 2; x]
Out: x$117
In: FullDefinition[y]
Out: y = x$117
Attributes[x$117] = {Temporary}
x$117[1] = 2
Run Code Online (Sandbox Code Playgroud)
由于y持有x 117美元的参考,因此x $ 117尚未被删除.现在让我们通过将y的值设置为1来删除引用:
In: y = 1;
Run Code Online (Sandbox Code Playgroud)
但是,x $ 117仍然在这里:
In: Definition[x$117]
Out: Attributes[x$117] = {Temporary}
x$117[1] = 2
Run Code Online (Sandbox Code Playgroud)
但我预计变量将被删除,因为它不再被引用.从Mathematica 的手册中,它说:
如果不再引用临时符号,则将其删除:
那么,这是Mathematica的一个错误吗?或者有任何解决方法吗?我正在使用Mathematica 7.0.非常感谢你.
Temporary当变量不再有引用时,Mathematica 确实会进行垃圾收集。也就是说,您的 x$117 没有被垃圾回收有两个原因。
请记住,它Module使用词法作用域,因此模块变量只是“本地”,因为它们被赋予唯一的名称“var$modnum”并且Temporary Attribute. 由于您提供了xa DownValue,因此必须先将其清除,然后x才能进行垃圾收集。
Youry被设置为临时变量x$...,输出被分配给Out[]. 所以你还需要清除历史记录:Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];。
那么你的Module例子似乎被正确地垃圾收集了。
当使用你的 MathOO 包(我昨天下载的,但还没有玩过)时,也许你可以将 设为$HistoryLength某个有限的数字。并建议用户抑制实例化的输出object1 = new[Object1][];
| 归档时间: |
|
| 查看次数: |
654 次 |
| 最近记录: |