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

标签 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 布局文件,同样是标准 GB 键盘的自定义 .xkb 布局。 Teck 存储 USB 端口的状态和哈希表的dict

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

目前tcl对OOP有很多扩展; TclOO、Snit、Stooop、Incr-Tcl、Xotcl 等等。既然Incr-Tcl类似于C++,那么是否有类似于Python的Tcl扩展?

最佳答案

没有一个 Tcl OO 系统在风格上与 Python 完全相似;语言不同,思考问题的方式也不同。部分原因是语法(大多数 Tcl 程序员不太喜欢 _ 字符!),但更重要的部分是 Tcl OO 系统无法在同样的方法:

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

最终的结果是,Tcl 的面向对象系统都使对象的行为类似于 Tcl 命令(当然,这允许很大的灵 active ),而不是像 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])。

关于python - 用于移植到 Python 代码的 Tcl 面向对象扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31462142/

相关文章:

Python 数据库连接 关闭

Python:如何对 Pandas 中的人之间的付款进行分组和求和?

javascript - Javascript 中 Tcl 的 'uplevel' 是什么?

networking - 期望脚本箭头键

python - pymongo.errors.InvalidOperation : cannot set options after executing query

c++ - 在这种特定情况下,多重继承有那么糟糕吗?

java - 为什么不能从子类访问 protected 方法?

perl - OOP/程序设计问题

tcl - TCL中的if语句

python:将变量名传递给类