python实现:用类实现一个图书馆,实现借书,入库,还书,查书,等功能,要求数据可以保存到文件中,退出后下次可以找回数据

时间:2021-06-15 17:50:16

第一步:标准化先获得信息

#coding=utf-8
import traceback
import pickle
import os
import os.path


class GRLlibrary(object):
    '''huiziz的图书馆'''
    def __init__(self,name,location):
        self.name=name
        self.location=location
        self.book_list=[]
    
    #获取图书馆的基本信息
    def get_library_info(self):
        info="名字:%s\n地点:%s"%(self.name,self.location)
        return info
    
#只有当文件本身被执行【被当做模块被其他程序引用】的时候,才会执行if里面的代码[下面代码的作用]
if __name__=="__main__":
    gr_library=GRLlibrary("光荣之路北京图书馆","北京")
    print (gr_library.get_library_info())

运行结果:

E:\workspace-python\test>py -3 a.py
名字:光荣之路北京图书馆
地点:北京

 

第二步:打印出command命令

class Book(object):
    def __init__(self,name,author,tag,price):
        self.__name = name
        self.__author = author
        self.__tag = tag
        self.__price = price 

    def get_book_name(self):
        return self.__name

    def set_book_name(self,new_name):
        self.__name = new_name

    def book_info(self):
        print(self.name,self.author,self.tag,self.price)

class GRLibrary(object):
    '''吴老师创建的创建的光荣之路图书馆!'''
    
    def __init__(self,name,location):
        self.name = name
        self.location = location
        
    def get_library_info(self):
        info = "名字:%s  \n地点:%s" %(self.name,self.location)
        return info

def list_info():
    print("""
        图书馆可以输入如下命令进行操作:
        create:创建图书馆
        use:使用某个图书馆
        add:增加图书
        borrow:借阅图书
        lend:还书
        list:查看库中的图书列表
        search:查看库中是否存在某本书
        """)
library = None
def create(library_name,location):
    global library
    library = GRLibrary(library_name,location)

if __name__ == "__main__":
    list_info()
    #gr_library = GRLibrary("光荣之路北京图书馆","北京")
    #print(gr_library.get_library_info())

运行结果:

E:\workspace-python\test>py -3 a.py

        图书馆可以输入如下命令进行操作:
        create:创建图书馆
        use:使用某个图书馆
        add:增加图书
        borrow:借阅图书
        lend:还书
        list:查看库中的图书列表
        search:查看库中是否存在某本书

 

第三步:实现创建图书馆、添加图书、查看库中图书列表-雏形

import traceback
import pickle
class Book(object):
    def __init__(self,name,author,tag,price):
        self.__name = name
        self.__author = author
        self.__tag = tag
        self.__price = price 

    def get_book_name(self):
        return self.__name

    def set_book_name(self,new_name):
        self.__name = new_name

    def book_info(self):
        print(self.name,self.author,self.tag,self.price)

class GRLibrary(object):
    '''吴老师创建的创建的光荣之路图书馆!'''
    def __init__(self,name,location):
        self.name = name
        self.location = location
        self.book_list=[]
        
    def get_library_info(self):
        info = "名字:%s  \n地点:%s" %(self.name,self.location)
        return info
        
    def add(self,book):
        self.book_list.append(book)
        #print ("%s图书入库成功"%book.get_book_name())
        
    def list(self):
        for book in self.book_list:
            #print (book)  #我写的
            print (book.get_book_name())   #获取每本书的书名

def list_info():
    print("""
        图书馆可以输入如下命令进行操作:
        create:创建图书馆
        use:使用某个图书馆
        add:增加图书
        borrow:借阅图书
        lend:还书
        list:查看库中的图书列表
        search:查看库中是否存在某本书
        exit:退出
        """)
library = None
def create_library():
    global library
    library_name=input("请输入图书馆的名字:").strip()
    location=input("请输入图书馆的地址:").strip()
    library = GRLibrary(library_name,location)  ####这个定义...嗯
    print (("********"+"["+"%s"+"]"+"图书馆创建成功"+"********")%library_name)

def add_book():
    book_name=input("请输入书名:").strip()
    author_name=input("请输入作者名:").strip()
    tag=input("请输入分类:").strip()
    price=input("请输入书的价格:").strip()
    book=Book(book_name,author_name,tag,price)
    if library is not None:
        library.add(book)
        print (("********"+"["+"%s"+"]"+"图书入库成功"+"********")%book_name)
    else:
        print ("图书馆还未创建,请输入create命令进行创建!")
        
def list_book():
    if library is not None:
        print ("图书列表为:")
        library.list()
        
command={"create":"create_library","add":"add_book","list":"list_book"}   #前面对应list_info中的值,后面对应要调用的方法
     
if __name__ == "__main__":
    list_info()
    while 1:
        try:
            user_command=input("请输入操作命令:").lower().strip()
            if user_command=="exit":
                break
            eval(command[user_command]+"()")  #执行程序:输入的东西+user_command就可以调用函数了
        except:
            traceback.print_exc()   #打印报错的堆栈信息
            if user_command not in command:
                print ("您输入的命令不存在")
            else:
                print ("您输入的命令有误,请按照命令列表输入:")
                print (list_info())
    #gr_library = GRLibrary("光荣之路北京图书馆","北京")
    #print(gr_library.get_library_info())

运行结果:

E:\workspace-python\test>py -3 a.py

        图书馆可以输入如下命令进行操作:
        create:创建图书馆
        use:使用某个图书馆
        add:增加图书
        borrow:借阅图书
        lend:还书
        list:查看库中的图书列表
        search:查看库中是否存在某本书
        exit:退出

请输入操作命令:create
请输入图书馆的名字:zita
请输入图书馆的地址:虹口
********[zita]图书馆创建成功********
请输入操作命令:add
请输入书名:测试开发
请输入作者名:吴老师
请输入分类:测试
请输入书的价格:68
********[测试开发]图书入库成功********
请输入操作命令:add
请输入书名:自动化测试
请输入作者名:吴老师
请输入分类:测试
请输入书的价格:99
********[自动化测试]图书入库成功********
请输入操作命令:list
图书列表为:
测试开发
自动化测试

 

终极:写入文件+添加注释

import traceback
import pickle
import os
import os.path
class Book(object):
    def __init__(self,name,author,tag,price):   #定义4个书的实例变量
        self.__name = name
        self.__author = author
        self.__tag = tag
        self.__price = price 

    def get_book_name(self):
        return self.__name

    def set_book_name(self,new_name):
        self.__name = new_name

    def book_info(self):
        print(self.name,self.author,self.tag,self.price)

class GRLibrary(object):
    '''吴老师创建的创建的光荣之路图书馆!'''
    def __init__(self,name,location):
        self.name = name
        self.location = location
        self.book_list=[]  #存储所有的书的实例对象
        
    def get_library_info(self):
        info = "名字:%s  \n地点:%s" %(self.name,self.location)
        return info
        
    def add(self,book):
        self.book_list.append(book)
        #print ("%s图书入库成功"%book.get_book_name())
        
    def list(self):
        for book in self.book_list:
            #print (book)  #我写的
            print (book.get_book_name())   #获取每本书的书名
  
    def find(self):
        book_search=input("请输入要查找书的名字:")
        for book in self.book_list: 
            if book.get_book_name()==book_search:
                print ("找到了%s"%book_search)
                break
        else:
            print ("没有找到%s"%book_search)
        
def list_info():
    print("""
        图书馆可以输入如下命令进行操作:
        create:创建图书馆
        use:使用某个图书馆
        add:增加图书
        borrow:借阅图书
        lend:还书
        list:查看库中的图书列表
        find:查看库中是否存在某本书
        exit:退出
        """)
library = None
library_data_file_path=""

#封装了一个函数,这个函数实质上是在操作实例对象。所有要输入的参数通过命令行的方式让用户输入,然后再操作类。这个设计模式叫代理
#一个函数把这个类的所有操作都实现了
def create_library():
    global library
    library_name=input("请输入图书馆的名字:").strip()
    location=input("请输入图书馆的地址:").strip()
    library = GRLibrary(library_name,location)  ####这个定义...嗯
    print ("图书馆创建成功")

def use_library():
    global library
    global data_file_path
    data_file_path=input("请输入图书馆数据文件的位置:").strip()
    if os.path.exists(data_file_path):
        try: 
            fp=open(data_file_path,"rb")
            library=pickle.load(fp)  ###盲点。通过pickle模块的反序列化操作,从文件中创建上一次程序保存的对象。
            library_data_file_path=data_file_path  #库恢复出来了
        except:
            print ("图书馆的数据文件没有合法的数据")
    
def add_book():
    book_name=input("请输入书名:").strip()
    author_name=input("请输入作者名:").strip()
    tag=input("请输入分类:").strip()
    price=input("请输入书的价格:").strip()
    book=Book(book_name,author_name,tag,price)
    if library is not None:
        library.add(book)
        print (("["+"%s"+"]"+"图书入库成功")%book_name)
    else:
        print ("图书馆还未创建,请输入create命令进行创建!")
        
def list_book():
    if library is not None:
        library.list()
        
def find_book():
    global library
    if library is not None:
        library.find()

command={"create":"create_library","add":"add_book","list":"list_book","use":"use_library","find":"find_book"}   #前面对应list_info中的值,后面对应要调用的方法
     
if __name__ == "__main__":
    list_info()
    while 1:
        try:
            user_command=input("请输入操作命令:").lower().strip()
            if user_command=="exit":
                if library_data_file_path=="":
                    library_data_file_path=input("请输入保存图书馆数据的数据文件路径:")
                fp= open(library_data_file_path,"wb")
                if library is not None:   
                    pickle.dump(library,fp) #序列化。通过pickle模块的序列化操作将程序中运行的对象信息保存到文件中去,永久存储
                fp.close()
                break
            eval(command[user_command]+"()")  #执行程序:输入的东西+user_command就可以调用函数了
        except:
            traceback.print_exc()   #打印报错的堆栈信息,调试用
            if user_command not in command:
                print ("您输入的命令不存在")
            else:
                print ("您输入的命令有误,请按照命令列表输入:")
                print (list_info())
            continue

 运行结果:

E:\workspace-python\test>py -3 a.py

        图书馆可以输入如下命令进行操作:
        create:创建图书馆
        use:使用某个图书馆
        add:增加图书
        borrow:借阅图书
        lend:还书
        list:查看库中的图书列表
        find:查看库中是否存在某本书
        exit:退出

请输入操作命令:create
请输入图书馆的名字:zita
请输入图书馆的地址:虹口
图书馆创建成功
请输入操作命令:add
请输入书名:测试开发
请输入作者名:吴老师
请输入分类:测试
请输入书的价格:68
[测试开发]图书入库成功
请输入操作命令:add
请输入书名:自动化测试
请输入作者名:吴老师
请输入分类:测试
请输入书的价格:99
[自动化测试]图书入库成功
请输入操作命令:list
测试开发
自动化测试
请输入操作命令:exit
请输入保存图书馆数据的数据文件路径:e:\\a.py

E:\workspace-python\test>py -3 a.py

        图书馆可以输入如下命令进行操作:
        create:创建图书馆
        use:使用某个图书馆
        add:增加图书
        borrow:借阅图书
        lend:还书
        list:查看库中的图书列表
        find:查看库中是否存在某本书
        exit:退出

请输入操作命令:use
请输入图书馆数据文件的位置:e:\\a.py
请输入操作命令:list
测试开发
自动化测试