序幕

简介:

  以下内容的目的在于简单介绍一下python编程领域的一些内容:
    数据表示---对象持久化---面向对象编程
  数据表示
    存储和表示数据,该数据包括待处理的数据也包括处理过后的数据,需要使用合理的数据结构进行装载。
  对象持久化
    该对象可包含数据对象,也可包含非数据对象(程序模块,函数等)。
  面向对象编程
    使用面向对象的方法将数据和处理数据的方法包装在对象中,形成类,以对象为中心的编程方法。

一、数据表示
  使用合理的数据结构存储和表示数据,在使用层面如何简单粗暴的评价一个设计合理的数据结构,那就看它是否具备便捷的增删改查能力。
  以数据库记录的表示方法为例:
    数据表示
      使用list,每条记录使用一个列表表示,多条记录采用列表嵌套的方式实现,使用列表索引进行增删改查。
      使用dict,每条记录使用一个字段表示,多条记录采用字典嵌套的方式实现,使用字典键进行增删改查。

  比较
    list依赖索引位置来获取记录的相关数据,字典通过键获取,可读性强。

二、持久化
  使用格式化文本,采用分隔符的形式隔开记录,格式化脚本需要拥有保存和读取逻辑,使用eval将对象字符串转换为python对象。  
  使用picklt持久化,将内存中的python对象转化成序列化的字节流(bytes),支持类似文件对象字节串。
  使用shelves持久化,使用起来像一堆只存储一条记录的pickle文件,类似于数据库一样,分为索引文件,数据文件等。

  比较
    使用shelves持久化较pickle性能好一些,也更方便一些。

三、走进OOP
  OOP面向对象
    结构
      把记录数据和处理逻辑自然地结合起来,合并在一个包里面,同时提供了一个层级结构(父类),使得代码更容易组织。
    封装
      将数据操作细节封装在类中的方法中,作为一个单独的作用域不会影响调用者的代码。
    定制
      通过子类进行定制或扩展,OOP通过定制来编程(一般调用父类的方法),而不是变更代码。

  持久化
    将类对象使用pickle持久化到文件中,这样类所包含的全部信息会被持久化保存。

  特点
    以对象为中心的编程方法,把数据和处理数据的逻辑方法,结合在一起,相比与字典更容易扩展,更易于描述数据之间的关系,变更和操作也更容易些。

  思考:
    以更大的视野来看待类这个结构,py文件可否视为一个类结构,里面的全局赋值对象视为类属性,def声明视为方法,import可看做是完成实例化动作吗?

四、增加控制台交互GUI

  使用OOP来构建GUI

 1 ###main.py
 2       from tkinter import *
 3       from tkinter.messagebox import showerror
 4       import shelve
 5       shelvename = 'class-shelve'
 6       fieldnames = ('name', 'age', 'job', 'pay')    
 7       
 8       def makeWidgets():
 9           global entries
10           
11           #初始化一个主窗口
12           window = Tk()    
13           window.title('People Shelve')
14           form = Frame(window)
15           form.pack()
16           entries = {}
17           
18           #绘制多个表单
19           for (ix, label) in enumerate(('key',) + fieldnames):
20               lab = Label(form, text=label)
21               ent = Entry(form)                #Entry负责表单处理
22               lab.grid(row=ix, column=0)    #
23               ent.grid(row=ix, column=1)
24               entries[label] = ent
25               
26           #绘制按钮,并关联动作      
27           Button(window, text='Fetch', command=fetchRecord).pack(side=LEFT)
28           Button(window, text='Update', command=updateRecord).pack(side=LEFT)
29           Button(window, text='Quit', command=window.quit).pack(side=RIGHT)
30           return window
31           
32       #查询逻辑      
33       def fetchRecord():
34           key = entries['key'].get()    #获取'key'框输入的值,相当于执行Entry(form).get()
35           try:
36               record = db[key]
37           except:
38               showerror(title='Error', message='No such key!')
39           else:
40               #若异常没有发生时,正常展示各个字段的数据
41               for field in fieldnames:
42                   entries[field].delete(0, END)    #删除列表指定位置数据
43                   entries[field].insert(0, repr(getattr(record,field)))    #插入数据
44 
45       #更新数据                
46       def updateRecord():
47           key = entries['key'].get()
48           if key in db:
49               record = db[key]
50           else:
51               from person import Person
52               record = Person(name='?', age='?')
53           for field in fieldnames:
54               setattr(record, field, eval(entries[field].get()))
55           db[key] = record
56           
57       #持久化到文件      
58       db = shelve.open(shelvename)
59       window = makeWidgets()
60       window.mainloop()
61       db.close()
62       
63     ###Person
64     class Person:
65        def __init__(self, name, age, pay=0, job=None):
66            self.name = name
67            self.age = age
68            self.pay = pay
69            self.job = job
70            
71        def lastName(self):
72               return self.name.split()[-1]
73            
74        def giveRaise(self, percent):
75               self.pay *= (1.0 + percent)    

  执行 C:UsersAdministratorAppDataLocalProgramsPythonPython35python.exe main.py

五、增加web界面
  使用GUI程序的用途可能较为局限于本地,或拷贝到其他地方运行,而使用基于web界面的程序则更容易实现网络交互运行。

  CGI编码实现方式
    客户端浏览器---web服务器---CGI脚本

    客户端浏览器
      几乎每个桌面电脑都会自带浏览器这个应用程序,用于网络资源访问。
    web服务器
      如apache,nginx等,python也有一些如wsgi。
    CGI脚本
      接收浏览器传过来的表单数据,标准输出信息是通过socket向客户端返回。

  执行方式
    (1)访问html页面,提交post表单数据
    (2)访问CGI脚本,数据以参数的形式附加在请求url末尾

  思考:
    CGI是通过socket向客户端返回数据,而web服务器返回给浏览器的是http响应。

  对比GUI
    用户交互的每一个步骤都会重新运行这个脚本,且每次都会重新打开数据库。

原文地址:https://www.cnblogs.com/solitarywares/p/10132562.html