用于移植到Python代码中的Tcl面向对象扩展

时间:2015-07-16 18:44:49

标签: python oop tcl

我正在为Linux构建状态栏。我已经为插入不同的键盘制作了一个模块:

set initialTeck [eval exec cat [glob /sys/bus/usb/devices/*/product]]
set initialTeck [string match *Truly* $initialTeck]

set initialKB [exec xkb-switch] 

dict set table samy 0 samy
dict set table samy 1 temy
dict set table temy 0 samy
dict set table temy 1 temy
dict set table gb   0 samy
dict set table gb   1 temy


proc init {} {
    variable initialTeck
    variable initialKB
    set currentTeck [eval exec cat [glob /sys/bus/usb/devices/*/product]]
    set currentTeck [string match *Truly* $currentTeck]
    set currentKB [exec xkb-switch]
    if {$initialTeck != $currentTeck} {
        set initialTeck $currentTeck
        nextKB $currentKB $initialTeck 
    }
}

proc nextKB { currentKB teck } {
    variable table
    exec [dict get $table $currentKB $teck]
}
while 1 {
init
after 1000

}

Temy是我为“真正的人体工程学键盘”制作的.xkb布局文件,samy为标准GB键盘定制.xkb布局。 Teck存储USB端口的状态,并为散列表存储dict

显然,状态栏还有更多模块,我已经使用了命名空间,但随着项目变大,我决定选择OOP。同时,我需要将项目翻译成Python代码,以便在开发人员之间共享。

目前tcl有许多OOP扩展; TclOO,Snit,Stooop,Incr-Tcl,Xotcl等等。因为Incr-Tcl类似于C ++,是否有类似于Python的Tcl扩展?

1 个答案:

答案 0 :(得分:2)

没有一个Tcl OO系统与Python的风格相似;语言不同,有利于不同的思考方式。部分内容是语法(大多数Tcl程序员不喜欢_字符 很多!)但更大的部分是Tcl OO系统不能正常工作以同样的方式:

  • 他们没有垃圾收集值,因为所有值的名称都可以存储为普通字符串。
  • 他们没有语言集成,允许拦截基本操作。

最终结果是Tcl的OO系统都使对象的行为类似于Tcl命令(当然,它允许很大的灵活性)而不像Tcl值(它们往往是非常简单的透明数字,字符串) ,列表和词典)。这使得OO的风格与Python中的风格完全不同。

你可以假装在我想的最简单的水平,但是一旦你开始做任何复杂的事情,你就会发现差异。不过要说的更多,我们需要选择一个更具体的例子供我们深入研究。

这里有一些Python code

class Shape:

    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.description = "This shape has not been described yet"
        self.author = "Nobody has claimed to make this shape yet"

    def area(self):
        return self.x * self.y

    def perimeter(self):
        return 2 * self.x + 2 * self.y

    def describe(self, text):
        self.description = text

    def authorName(self, text):
        self.author = text

    def scaleSize(self, scale):
        self.x = self.x * scale
        self.y = self.y * scale

这里是TclOO(我最喜欢的)中的等价类定义:

oo::class create Shape {
    variable _x _y _description _author

    constructor {x y} {
        set _x $x
        set _y $y
        set _description "This shape has not been described yet"
        set _author "Nobody has claimed to make this shape yet"
    }

    method area {} {
        return [expr {$_x * $_y}]
    }

    method perimeter {} {
        return [expr {2 * $_x + 2 * $_y}]
    }

    method describe {text} {
        set _description $text
    }

    method authorName {text} {
        set _author $text
    }

    method scaleSize {scale} {
        set _x [expr {$_x * $scale}]
        set _y [expr {$_y * $scale}]
    }
}

除了明显的语法差异(例如,Tcl喜欢大括号并在expr命令中放置表达式)之外,需要注意的主要事项是应该在类定义中声明,并且无需传递self(它自动作为命令出现,[self])。