《可爱的Python》读书笔记(五)

不论战术上如何变化,千万不要忘记战略。

在前些时候小白已经使用getopt获得命令行工具。

但是,要完成一个个看似简单,实际有 N 多情况的逻辑判定就有点烦人了。

热心的行者,又出声了:“使用 cmd 吧!”

cmd模块,是一个专门支持命令行界面的模块。让我们来重构一下它:

# -*- coding: utf-8 -*-
import sys
import cmd

class PyCDC(cmd.Cmd):

    
    def __init__(self):
        # 初始化基类,类的定量应该都在初始化时声明
        cmd.Cmd.__init__(self)
        # 定义命令行提示符
        self.prompt = ">"
        
    # 定义walk命令所执行的操作    
    def do_walk(self, filename):  
        if filename == "":
            filename = input("请输入cdc文件名:")
        print("扫描光盘内容保存到:'%s'" % filename)
        
    # 定义walk命令的帮助输出    
    def help_walk(self):  
        print("扫描光盘内容 walk cd and export init '.cdc'")
        
    # 定义dir命令所执行的操作
    def do_dir(self, pathname):  
        if pathname == "":
            pathname = input("请输入指定保存/搜索目录:")
            
    # 定义dir(命令的帮助输出    
    def help_dir(self):  
        print("指定保存/搜索目录")
        
    # 定义find命令所执行的操作   
    def do_find(self, keyword):  
        if keyword == "":
            keyword = input("请输入搜索关键词:")
        
    # 定义find命令的帮助输出
    def help_find(self):
        print("搜索关键词")
   
    # 定义quit命令所执行的操作
    def do_quit(self, arg):
        sys.exit(1)
        
    # 定义quit命令的帮助输出
    def help_quit(self):
        print("Syntax:quit")
        print("--terminates the application")
        
    # 定义quit的快捷方式
    do_q = do_quit
    
    
if __name__ == '__main__':
    cdc = PyCDC()
    cdc.cmdloop()

运行效果如下:

>help
Documented commands (type help <topic>):
========================================
dir  find  help  quit  walk
Undocumented commands:
======================
q
>dir
请输入指定保存/搜索目录:cdc
>walk
请输入cdc文件名:test.cdc
扫描光盘内容保存到:'test.cdc'
>?find
搜索关键词
>xx
*** Unknown syntax: xx
>q
>>> 
==========================
>find
请输入搜索关键词:images
>quit

可以看到,此代码纯粹是用来尝试cmd模块功能的,只能打印输出信息,没有任何实际作用。

从这个例子可以看出,首先PyCDC类继承cmd.Cmd类,然后在类中定义了walk,dir,find和quit,而命令q被作为quit的短命令形式。(也就是说,若须另外定义一条命令,如command,只要在PyCDC类中增加一个 do_command 函式)而该命令对应的帮助信息由help_command 函式给出。

就像示例中所写的那样,自定义的PyCDC类提供了的命令,是可以正常使用它们的,而xx命令是没有定义的,所以命令行提示为未知语法。最后的q命令和quit是一样的功能,即退出程序。

# -*- coding: utf-8 -*-
import os
import sys
from cdctools import *        # 可以引入己有脚本cdctools中的所有函数

def cdWalker(cdrom, cdcfile):

    export = ""
    for root, dirs, files in os.walk(cdrom):
        export += "\n %s;%s;%s" % (root, dirs, files)
    open(cdcfile, 'w').write(export)
    
    
if __name__ == "__main__":
    cdc = PyCDC()
    cdc.cmdloop()

哈哈,可以运行起来!可以看的出在代码中,按代码的复用尺度来分,从小到大应该是:代码行→函式→类→模块

好像还有更大的一级包,具体现在还用不上,那就先不管它了。

原文地址:http://blog.51cto.com/9473774/2090044

时间: 2024-11-05 20:49:52

《可爱的Python》读书笔记(五)的相关文章

&lt;java编程思想&gt;第一章读书笔记二

7.伴随多态的可互换对象 前面说了继承,我们知道继承中存在基类(父类)以及导出类(子类),不知道大家有没有遇到过这种情况?就是在向一个方法中传递一个对象作为参数时,我们往往会选择传递一个基类而不是一个子类,为什么要这么做呢?其实原因也很简单,说的高大上一点就是这样做有利于代码的健壮性和可扩展性,说的详细还是有利于代码的健壮性和可扩展性,更重要的也就是可扩展性. 还拿喝可乐的例子来说,如果你传递的参数对象是可乐,那么不管你是给我百事可乐还是可口可乐我都可以接受啊,但是如果你传递的参数仅仅是百事可乐

《Java编程那点事儿》读书笔记(五)

System 1)arraycopy int[] a = {1.2.3.4}; int[] b = new int[5]; System.arraycopy(a,1,b,3,2); //把数组a中从下标1开始的元素复制到数组b中下标为3的位置,总共复制2个元素 2)currentTimeMillis long l = System.currentTimeMillis(); //返回当前时间与1970年01月01日0时0分0秒的差值数(毫秒) 3)gc:请求系统进行垃圾回收 4)public st

《Java编程那点事儿》读书笔记(七)——多线程

1.继承Thread类 通过编写新的类继承Thread类可以实现多线程,其中线程的代码必须书写在run方法内部或者在run方法内部进行调用. public class NewThread extends Thread { private int ThreadNum; public NewThread(int ThreadNum){ this.ThreadNum = ThreadNum; } public void run(){ try{ for(int i = 0;i < 10;i ++){ T

《Java编程那点事儿》读书笔记(四)

String 1.toString:显示对象内容时系统自动调用的方法. public class TOSTRING { public String toString(){ return "this is toString method"; } } TOSTRING t = new TOSTRING(); System.out.println(t); 2.Math Math.函数 3.String 1)char charAt(int n)  //获得字符串索引为1的字符 String a

《JAVA编程那点事儿》读书笔记(二)

方法: 1. 基本的main方法: public static void main(String[] args) 2.静态方法内部调用非静态方法:重新声明一个类,通过这个类来调用非静态方法 1 public class MAINMETHOD { 2 public static void main(String[] args) { 3 MAINMETHOD mm = new MAINMETHOD(); 4 System.out.printf("%d", mm.max(5, 6)); 5

《Java编程那点事儿》读书笔记(六)

1.抛出异常:throw 异常对象; 下面的代码是一个进制转换代码,可以转换为2进制和8进制,如果输入其他参数,则抛出异常. 1 public static String transform(int value,int radix){ 2 if(value <0 ) 3 throw new IllegalArgumentException("需要转换的数字不是自然数!"); 4 5 if(radix != 2 || radix != 8) 6 throw new IllegalA

《Java编程那点事儿》读书笔记(三)

1. static 1)静态变量:Java虚拟机为静态变量开辟单独的存储空间,所以所有的对象内部的静态变量在内存中都指向同一个地址,那么不管哪个对象改变这个成员变量,所有对象中该成员变量的值都发生变化.调用的方法一般为 类名.成员变量(常量) 2)静态方法:静态方法内部只能使用静态的成员变量,调用的方法: 类名.方法名(参数) 3)静态代码块:静态代码块在该类第一次被使用时执行一次,以后再也不执行.例如: public class StaticBlock{ static{ System.out.

《Java编程那点事儿》读书笔记(一)

觉得自己记忆力很烂的样子,读书不做笔记就好像没读一样,所以决定以后读技术类的书籍,都要做好笔记. 1.IP地址和域名:如果把IP地址类比成身份证号的话,域名就是持证人的名字. 2.端口:规定一个 设备有216个,也就是65536个端口,每个端口对应一个唯一的程序. 0~1024之间多被操作系统占用,所以实际编程时一般采用1024以后的端口号. 3.文档注释:指可以被提取出来形成程序文档的注释格式.格式如下: /** 注释内容 */ 4.最大公约数程序 1 public class MaxComm

《java并发编程的艺术》读书笔记-第三章Java内存模型(二)

一概述 本文属于<java并发编程的艺术>读书笔记系列,第三章java内存模型第二部分. 二final的内存语义 final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.可以参照之前整理的关键字final.这里作者主要介绍final域的内存语义. 对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序. 初次读一个包含final域的对象的引用,与随后初次读这

《Android编程权威指南》-读书笔记(五)-挑战练习

<Android编程权威指南>-读书笔记(五) -挑战练习 为了巩固学习,为了建立信心.开始进行如下挑战: 挑战练习一:为TextView添加监听器 书中给出了提示,TextView,Button都是View的子类,都可以设置OnClickListener()直接加入如下代码: mQuestionTextView.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ mCurr