RWPy4learner 11.3.30 documentation

Version: 11.3.30
[首页] 模块万岁! << 制作、使用自己的模块 (Source) >>使用正则表达式

制作、使用自己的模块

小白的虚荣心

经过行者们的指点,小白了解到了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'])