很多刚学 Python 的朋友会觉得“爬虫只是用 requests
发请求,用 BeautifulSoup
抓数据就好了”,但真正写出可维护、可复用、可扩展的爬虫,会不会使用类和方法以及函数是关键。
本文将带你一起分析一个“图书信息录入 + 满减优惠系统”的完整示例,通过构建 Book
和 BookBundle
两个类,以及定义的main()函数掌握实例化、方法调用、列表操作和异常处理的关键知识点。
目标是让用户输入若干本书的信息,自动计算总价,并判断是否达到某个金额以享受折扣。比如满 200 元打 85 折。
代码分为三个模块:
Book
类:表示单本图书。
BookBundle
类:表示一组图书并提供价格计算与优惠功能。
main()
函数:负责用户交互,输入书籍信息并调用逻辑。
Book
类定义class Book:
def __init__(self,book_name,author,price): #__init__是创建Book的属性
self.book_name=book_name #self指的是当前对象Book
self.author=author
self.price=price
def display_info(self): #创建方法,展示图书信息
print(f"{self.author}的{self.book_name}这本书的价格是{self.price}元!")
知识点:
创建Book(self,book_name,author,price)就是创建一个实例(对象);
每本书都是Book的一个“实例”;
self.xxx是绑定在该对象上的属性。
f-string可以使得格式化更美观和便捷。
2. BookBundle
类定义
为了能够同时进行多本书籍的信息统计,创建BookBundle类,来统计用户所购买的所有书籍的信息。包括计算所有书籍的价格总额,书籍优惠折扣等。
class BookBundle: def __init__(self,books): self.books=books
定义BookBundle类用来接收一本或多本书组成的列表。
def total_price(self):
return sum(book.price for book in self.books)
使用内置函数sum计算所有书的总价。
def apply_discount(self,threshold=200,rate=0.8):
#threshold是参与优惠的界限,200元以上才能有优惠。
if self.total_price() >=threshold: #对消费者的金额进行判断,是否能有优惠
discounted=self.total_price()*rate #计算优惠后的金额
saved=self.total_price()-discounted #计算为用户优惠了的金额
print(f"您一共消费{self.total_price():.2f}元,已给您优惠{saved:.2f}元,您需要支付{discounted:.2f}元。")
else:
print(f"您总共消费{self.total_price():.2f}元,欢迎下次光临!")
知识点:
方法调用:使用self.total_price()
可以在类内部访问另一个方法;
if 用于进行用户消费金额的判断,满足满减条件的金额就会执行if下面的语句,否则就会执行else语句。
if 语句中进行比较的数据,他们的数据类型(type)必须相同。
格式化输出 :.2f
表示保留两位小数。
main()
函数:定义main()主函数,独立于类存在,串联起之后用户输入的内容,从而调用上面已经创建好的Book、BookBundle类,实现较复杂的操作。
def main():
book_list=[]
try: #防止因为用户输入错误,程序报错。如果用户输入错误,则会执行except语句。
num=int(input("请输入您要添加的书籍数量:"))
#下方的for语句会使用num,必须要将输入的string类型转成int类型
for i in range(num):
i += 1
print(f"\n第{i}本书的信息是:")
name=input("书的名称是:")
author_name=input("作者的名字是:")
book_price=float(input("这本书的价格是:"))
#在循环中创建多个 Book 的数据。
在main函数内部,创建实例之后,使用封装好的 display_info()
方法来显示图书信息,并将
每本书对象(使用append)存入列表,后面统一交给 BookBundle
处理。
book = Book(name, author_name, book_price) #创建Book实例
book.display_info()
book_list.append(book)
bundle = BookBundle(book_list)
bundle.apply_discount(threshold=200, rate=0.85)
except ValueError:
print("请输入正确的内容格式!")
将所有书组成一个“图书集合” book_list 交给 BookBundle
管理,将用户所购买的所有书籍的信息进行处理。
调用 apply_discount()
方法自动判断是否打折、打印优惠信息。
最后使用main()调用整个程序。
if __name__ == '__main__':
main()
运行程序,实现的程序效果是:
恭喜你成功学会了类和方法的使用,本文的内容看起来像“只是对书打个折”,实则是你日后写爬虫、写接口、写框架的必备基础!也总结了在代码编写过程中易出现的错误,希望能够帮助你写出更高效的代码!