zoukankan      html  css  js  c++  java
  • 序幕

    简介:

      以下内容的目的在于简单介绍一下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
        用户交互的每一个步骤都会重新运行这个脚本,且每次都会重新打开数据库。

  • 相关阅读:
    GNU编码标准
    glade2 与 glade 3 (转)
    简单 gcc 参数
    gtk 主循环函数
    指针与数组关联导致的一些现象
    C语言声明数组变量时,在什么情况下,可不指定数组大小
    文件复制函数的效率比较
    关于VMware虚拟机的上网
    errno的基本用法
    查找数组中最大的2个数
  • 原文地址:https://www.cnblogs.com/solitarywares/p/10132562.html
Copyright © 2011-2022 走看看