Properties Itcl什么是读取属性?

Properties Itcl什么是读取属性?,properties,tcl,itcl,Properties,Tcl,Itcl,我想控制对Itcl公共变量的读取访问。对于写访问,我可以使用以下方法执行此操作: package require Itcl itcl::class base_model_lib { public variable filename "" } itcl::configbody base_model_lib::filename { puts "in filename write" dict set d_model filename $filename } configbod

我想控制对Itcl公共变量的读取访问。对于写访问,我可以使用以下方法执行此操作:

package require Itcl
itcl::class base_model_lib {
    public variable filename ""
}
itcl::configbody base_model_lib::filename {
    puts "in filename write"
    dict set d_model filename $filename
}
configbody定义调用config时发生的情况:
$obj configure-filename foo.txt
。但是我如何控制阅读过程中发生的事情呢?想象一下,我想做的不仅仅是在读取过程中查找值

我想继续使用标准的Itcl模式,即使用cget/configure向用户公开这些内容

这就是我的问题。然而,让我描述一下我真正想做什么,你告诉我是否应该做一些完全不同的事情:)

我喜欢python类。我喜欢创建一个变量并从实例外部读/写它。稍后,当我想玩的时候,我将创建方法(使用
@property
@property.setter
)来定制读/写操作,而不让用户看到API的更改。我也在尝试做同样的事情

我的示例代码还建议了我想做的其他事情。实际上,文件名存储在字典内部。我不想向用户公开整个字典,但我希望他们能够更改该字典中的值。因此,“filename”实际上只是一个存根。我不想要一个名为that的公共变量。相反,我想使用cget和configure来读取和写入一个“thing”,我可以选择创建一个简单的公共变量,也可以定义一个查找过程


PS:我确信我可以创建一个使用一个或两个参数的方法。如果一个是读的,两个是写的。我认为这不是解决问题的方法,因为我不认为您可以使用cget/configure方法。

所有Itcl变量都映射到名称难以猜测的命名空间中的Tcl变量。这意味着您可以在通过Tcl的标准跟踪机制读取变量时(在实际读取变量之前)得到回调;你所需要做的就是去做。这需要使用
itcl::scope
,最好使用
itcl::code$This
完成,这样我们就可以使回调成为私有方法:

package require Itcl
itcl::class base_model_lib {
    public variable filename ""
    constructor {} {
        trace add variable [itcl::scope filename] read [itcl::code $this readcallback]
    }
    private method readcallback {args} {         # You can ignore the arguments here
        puts "about to read the -filename"
        set filename "abc.[expr rand()]"
    }
}
所有
itcl::configbody
所做的工作实际上等同于变量写入跟踪,变量写入跟踪更为常见,不过我们通常希望您在这些天直接设置跟踪,因为这是一种更为通用的机制。运行上述脚本后进行演示:

% base_model_lib foo
foo
% foo configure
about to read the -filename
{-filename {} abc.0.8870089169996832}
% foo configure -filename
about to read the -filename
-filename {} abc.0.9588680136757288
% foo cget -filename
about to read the -filename
abc.0.694705847974264
如您所见,我们通过标准机制精确控制读取内容(在本例中,一些随机变化的胡言乱语,但您可以做得更好)