序幕
简介:
以下内容的目的在于简单介绍一下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:\Users\Administrator\AppData\Local\Programs\Python\Python35\python.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
用户交互的每一个步骤都会重新运行这个脚本,且每次都会重新打开数据库。