制作、使用自己的模块¶
小白的虚荣心¶
经过行者们的指点,小白了解到了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(一个文件对象)
此乃读取
实例化¶
不同的类要储存不同的数据啊!可以通过实例化来创建一个具体的类。
最基础的实例化:
>>> 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能获取类中的属性、方法,所以此参数绝对不是摆设