制作、使用自己的模块 ==================== 小白的虚荣心 ------------------- 经过行者们的指点,小白了解到了Python模块的强大。 只要把代码模块化,就可以重复使用这部分代码了。也可以让其它用户安装这个模块,其他程序员,即使不知道模块怎么实现的,也可以通过很容易地使用模块实现的功能。小白叹道:“啥时候能有自己的模块啦!”。想想自己的应用如果能通过python setup.py install安装,然后直接使用,那该多好呀! 行者曰:你写的每一个程序其实都是模块呀! 小白曰:真滴?咋整阿? 回顾需求 -------------------- 为了方便地管理代码,小白想把自己的程序中管理数据的那一块拿出来,独立成模块进行改造。 开工 ---------------------- 小白将自己的模块命名为TextDB,就是以文件保存数据 小白对自己的模块做了一个整体规划: - 用list储存数据 - 查找数据 - 删除数据 - 读取本地数据文件(文件后缀.tdb) - 写数据文件 模块功能看似多,但其实实现起来很容易。 客串知识点:类 ~~~~~~~~~~~~~~~~ 所谓类,就是…… 假设有一个“汽车”类,那么,这个类里面会有属性,比如,这个汽车是大众的,就是一个属性 再比如,这个汽车是浙江车,也是一个属性 类里面还有“方法”,比如让汽车“开”“停”都是方法 恩,这么看,“类”很接近我们现实生活中对物体的描述。那么,就用一个类来表示数据吧。 用一个类来表示数据 -------------------------- 小白定义了一个类叫作Data,并用列表content来储存数据。 这个Data类拥有添加,删除,获取编号和读写,这些方法: - add 添加 - delete 删除 - get 获取相应编号的数据 - save、read 实现读写 那么,如何吧一个对象变为纯文本储存在硬盘上呢?小白在列表上咨询了一下行者们。 回答:用对象腌制器pickle模块。小白上bing搜索了一下“python pickle”,在python的官方页面里找到了更多的pickle的介绍。哦,原来pickle是一个提供快速存储数据到本地文件的模块: http://docs.python.org/library/pickle.html 小白在官方文档说明中读到,pickle提供了pickle.dump()和pickle.load()两个函数用于数据的存储和读取。恩!用dump和load函数就可以很容易地实现通讯录信息的读写了。好的!就用pickle模块来实现读写功能了。 此外,pickle还有一个孪生兄弟cpickle,使用C实现的,速度上比pickle快一点,但有时候会导入失败。 将思想转化为代码 ----------------------- 小白新建一个python 文件,取名为 TextDB.py :: #-*- coding:utf-8 -*- try: import CPickle as pickle except: import pickle #听说Cpickle比较快 #这两个模块大小写真tmd烦人 class Data(): #类! """ 这是docstring! 数据结构 content[0]是一个列表,content[0][0]开始是键值 content[1]开始存放数据,与键值一一对应 比如一个表格: id name age 1 Su 23 2 Mike 24 3 Tony 21 抽象之: content[0]=['name','age'] content[1]=['Su','23'] content[2]=['Mike','24'] content[3]=['Tony','21'] """ content=[] #数据存放 def __init__(self,arg): #传进一个list self.content.append(arg) def add(self,arg): #同上 self.content.append(arg) def get(self,num): num=int(num) if num>len(self.content)-1: print "没有这条记录" else: return self.content[num] def delete(self,num): num=int(num) if num>len(self.content)-1: print "没有这条记录" else: if num==0: print"不能删除键表" else: del self.content[num] def save(self,name): f=file(name+'.tdb','w') pickle.dump(self.content, f) f.close() def read(self,name): f=file(name+'.tdb') self.content=pickle.load(f) f.close() 要讲的都在注释中了 pickle模块的dump是写,load是读 pickle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :: try: import CPickle as pickle except: import pickle 先尝试导入CPickle,如果失败,就导入pickle。这样无论如何都可以成功导入进pickle模块。这样做的原因是因为有时候无法成功导入CPickle。 :: pickle.dump(一个对象,一个文件对象) 此乃加密+写入 :: var=pickle.load(一个文件对象) 此乃读取 备注:try语句 ~~~~~~~~~~~~~~~~~~~~~ :: try: 语句1 except: 语句2 当语句1出现错误时,立马执行语句2。 实例化 ------------------------- 不同的类要储存不同的数据啊!可以通过实例化来创建一个具体的类。 最基础的实例化:: >>> a=str('pythoner') >>> a 'pythoner' >>> str类在Python中内置,自己写的类或者第三方库也是一样的。 __init__的故事 --------------------- 在上一章有所解释,就是一旦被实例化就执行的方法,看实例:: class foo(): def __init__(self,name): print name new=foo('Su') 输出:: Su *注意:所有方法的参数中必须有一个self参数 self的故事 ------------------------- 实例:: class foo(): content='hello,pythonic' def __init__(self): print self.content a=foo() 输出:: hello,world self能获取类中的属性、方法,所以此参数绝对不是摆设 使用自己的模块 ----------------- 唯一要注意的是——命名空间使用‘.’分开,就OK了 比如,实例化一个类 :: addr=TextDB.Data(['name','tel','address','birthday'])