博客开张+第1个项目:云云图书馆

我是编程业余爱好者,工作是中学里面的档案管理员。除了大学学过C++,我的工作跟编程没什么关系,但因为管理电子档案,所以跟excel打交道还是挺多的。

今年3月,我被小姐妹安利了在风变学python,于是报了名,花了2个月毕业了。期间除了完成课堂作业,自己也做了一些小项目,很有趣。以后大概也会继续在编程的世界里愉快玩耍吧,于是就在这里开个博客分享记录一下。

先来一张图,记录我到目前为止的所有项目(按最后改动时间排序):

博客开张+第1个项目:云云图书馆_第1张图片

 

第一个项目:云云图书馆

博客开张+第1个项目:云云图书馆_第2张图片

【创作背景】

当时正在学python基础语法,学到“类和对象”。这应该是基础语法的第一个难点,我跟着课程跑了一遍,整个人都是晕的。实在没勇气开始下一章,于是就想,自己再把课堂练习(《流浪图书馆》)换汤不换药的再敲一遍,改成自己的项目来练练手。

【功能设想】

作为一个图书管理系统,首先进去应该是一个菜单,可以选择各功能。功能有浏览书目(内置),添加书籍,借书还书(需要创建借阅人信息)。

【功能实现】

图书馆里的书都有书名,作者,内容简介,借阅状态,借书人信息,预定归还日期这些信息。添加书籍的时候也需要录入这些信息。所以需要创建一个类来管理所有的书籍,每一本书就是一个对象。
功能1:浏览全部书籍,就是打印出所有对象的信息。
功能2:添加书籍,就是创建新的对象。
功能3:借书,给对象的 借阅状态/借书人信息/预定还书日期 这三个信息重新赋值。借书之前要先判断本书是否已经被借走,如果已经被借走,告知预定归还日期。
功能4:还书,给对象的 借阅状态/借书人信息/预定还书日期 这三个信息重新赋值。还书之前要判断本书是否已经被归还。设定默认借书时间为一个月,需要用datetime函数来计算书籍是否过期(当时还不太会用,只做了个粗糙版的日期计算器),过期了就提示要缴罚款。
菜单:每个功能完成之后要回到主菜单,用 while True 循环。
优化:程序主体完成之后,可以优化一些小的细节,比如预定输入数字但实际输入了字母的时候,提示“输入有误,重新输入”,而不是直接闪退。

【 效果体验】

博客开张+第1个项目:云云图书馆_第3张图片

【完工感受】

敲完这个项目之后,我感觉对类和对象,以及函数的使用有了一点信心。知道了常见的坑在哪里(因为自己都跳过),甚至能在学习群里回答一些小伙伴的提问了。
这个项目是我第一个融入了自己想法的项目,它奠定了我之后编写小程序的风格(就是只关注功能,不关注颜值的偷懒风格)。
这个项目做完,阿云就继续前行,朝着自动发邮件的关卡冲去啦~

【完整代码】

import time
import datetime
class Book():
    # 需要基本属性:书名,作者,推荐语,借阅状态,借阅人姓名,预定归还日期
    def __init__(self,bookname,author,comment,state=0,lender=None,returndate=None):
        self.bookname=bookname
        self.author=author
        self.comment=comment
        self.state=state
        self.lender=lender
        self.returndate=returndate

    def __str__(self):
        #列出书籍基本信息
        state='未借出'
        if self.state==1:
            state='已借出'
        return '\n书名:%s\n作者:%s\n推荐语:%s\n借阅状态:%s\n借阅人:%s\n预定归还日期:%s' %(\
            self.bookname,self.author,self.comment,state,self.lender,self.returndate)
class Bookmanager():
    books=[]

    def __init__(self):
        #添加3本初始化书籍,供测试
        book1=Book('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示,一首对默默无闻、失败、智慧、困难和沉默的赞美诗。')
        book2=Book('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。')
        book3=Book('爱的流放地','渡边淳一','霜王有梦,神女无心。绝望的爱情,心中的桃花源。',1,'健健','2021-03-22')
        self.books.append(book1)
        self.books.append(book2)
        self.books.append(book3)
    
    def menu(self):
        #选择菜单
        print('-'*75,'\n\n欢迎来到阿云图书馆,每本沉默的好书都是一座流浪的岛屿,希望你有缘发现并着陆。\n制作:云云\n日期:2021.3.25')
        while True:
            time.sleep(0.5)
            print('\n'+'-'*75)
            choice=input('\n1.浏览全部书籍\n2.添加书籍\n3.借阅书籍\n4.归还书籍\n5.退出系统\n\n请输入数字选择您需要的功能:')
            if choice=='1':
                self.showallbook()
            elif choice=='2':
                self.addbook()
            elif choice=='3':
                self.lendbook()
            elif choice=='4':
                self.returnbook()
            elif choice=='5':
                print('\n感谢使用。愿你我成为爱书之人,在茫茫书海里相遇。再会。')
                input('\n按回车键结束程序')
                break
            else:
                print('\n------输入有误,请输入数字来选择功能------')
            
    def showallbook(self):
        #function 1
        for book in self.books:
            print(book)
            print('')

    def addbook(self):
        #function 2
        newname=input('\n请输入书籍名称:')
        newauthor=input('\n请输入作者:')
        newcomment=input('\n请输入推荐语:')
        newbook=Book(newname,newauthor,newcomment)
        self.books.append(newbook)
        print('\n书籍录入成功!')

    def check(self,name):
        for book in self.books:
            if name==book.bookname:
                return book
        else:
            return None

    def monthplus1(self):
        import datetime
        today=datetime.date.today()
        if today.month!=12:
            res=today.replace(month=today.month+1)
        else:
            res=today.replace(month=1)
            res=today.replace(year=today.year+1)
        return res
            
    def lendbook(self):
        #function 3
        name=input('\n请输入书籍名称:')
        if self.check(name)==None:
            print('\n查无此书')
        else:
            sta=self.check(name).state
            if sta==0:
                self.check(name).state=1
                self.check(name).lender=input('\n请输入您的姓名:')
                self.check(name).returndate=self.monthplus1()
                print('\n借阅成功,借阅期限是1个月,请记得在{}之前归还哦!'.format(self.check(name).returndate))
            else:
                print('\n您来晚了一步,该书已经被借走了。预定归还日期是{}。'.format(self.check(name).returndate))

    def totalday(self,day):
        import datetime
        self.day=day
        day=str(day)
        day_year=int(day[:4])
        day_month=int(day[5:7])
        day_day=int(day[8:10])
        totalday=day_year*365+day_month*30+day_day
        return totalday

    def returnbook(self):
        #function 4
        name=input('\n请输入书籍名称:')
        if self.check(name)==None:
            print('\n无此书,请检查您的输入是否正确。')
        else:
            sta=self.check(name).state
            if sta==1:
                self.check(name).state=0
                #检查是否超时
                dayshould=self.check(name).returndate
                dayactual=datetime.date.today()
                diff=self.totalday(dayactual)-self.totalday(dayshould)
                
                if diff>0:
                    print('\n归还成功。但您的借阅时间超时了{}天,需要付{}元超时费。谢谢。'.format(diff,diff*0.5))
                else:
                    print('\n归还成功。')
                self.check(name).lender=None
                self.check(name).returndate=None
                
            else:
                print('\n这本书还没有被借走呢。请检查您的输入是否正确。')

manager=Bookmanager()
manager.menu()

 

 

 

你可能感兴趣的:(python,类)