第十四章:应用构建模块-cmd:面向行的命令处理器-覆盖基类方法

14.5.5 覆盖基类方法
Cmd包括的很多方法可以被覆盖为hook,来采取动作或改变基类行为。下面这个例子并不详尽,不过其中包含很多经常用到的很有用的方法。

# Set up gnureadline if installed.
try:
    import gnureadline
    import sys
    sys.modules['readline'] = gnureadline
except ImportError:
    pass

import cmd

class Illustrate(cmd.Cmd):
    "Illustrate the base class method use."

    def cmdloop(self,intro=None):
        print('cmdloop({})'.format(intro))
        return cmd.Cmd.cmdloop(self,intro)

    def preloop(self):
        print('preloop()')

    def postloop(self):
        print('postloop()')

    def parseline(self,line):
        print('parseline({!r}) =>'.format(line),end='')
        ret = cmd.Cmd.parseline(self,line)
        print(ret)
        return ret

    def onecmd(self,s):
        print('onecmd({})'.format(s))
        return cmd.Cmd.onecmd(self,s)

    def emptyline(self):
        print('emptyline()')
        return cmd.Cmd.emptyline(self)

    def default(self,line):
        print('default({})'.format(line))
        return cmd.Cmd.default(self,line)

    def precmd(self,line):
        print('precmd({})'.format(line))
        return cmd.Cmd.precmd(self,line)

    def postcmd(self,stop,line):
        print('postcmd({},{})'.format(stop,line))
        return cmd.Cmd.postcmd(self,stop,line)

    def do_greet(self,line):
        print('hello,',line)

    def do_EOF(self,line):
        "Exit"
        return True

if __name__ == '__main__':
    Illustrate().cmdloop('Illustrating the methods of cmd.Cmd')

cmdloop()是解释器的主处理循环。通常没有必要覆盖这个循环,因为可以使用preloop()和postloop hook。
每次cmdloop()迭代都会调用onecmd(),将命令分派到它的处理器。实际输入行用parseline()解析来创建一个元组,其中包括命令和该行上的其余部分。如果这一行为空,则调用emptyline()。默认实现会自爱吃运行前面的命令。如果这一行包含一个命令,那么首先调用precmd(),然后查看并调用处理器。如果没有找到,则
调用default()。最后调用postcmd()。

以下输出显示增加了print语句的一个示例会话。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值