Python入门到进阶:类与对象,以及面向对象编程

面向对象-序 当需求变得复杂时,单纯使用面向过程的思想编程会导致代码可读性和可维护性下降。假设你正在开发一个图书管理程序。最初,你可能会用这种最直接的方式记录书籍信息: book1_title = "Python编程从入门到实践" book1_author = "埃里克·马瑟斯" book1_isbn = "978-7115613639" book1_stock = 5 book2_title = "流畅的Python" book2_author = "卢西亚诺·拉马略" book2_isbn = "978-1492056355" book2_stock = 3 很快你发现,每新增一本书,都要重复定义一堆变量。于是你灵机一动,把每本书的数据都抽离出来变成一个列表: books = [ ["Python编程从入门到实践", "埃里克·马瑟斯", "978-7115613639", 5], ["流畅的Python", "卢西亚诺·拉马略", "978-1492056355", 3] ] 但是这样每次查询书的信息都要依赖books[0][0]、books[2][3]等索引,这很不直观,要是单独看这段代码,你完全不知道这些索引都会访问什么数据。所幸,你想起了Python还有个东西叫字典: books = [ { "title": "Python编程从入门到实践", "author": "埃里克·马瑟斯", "isbn": "978-7115613639", "stock": 5, }, { "title": "流畅的Python", "author": "卢西亚诺·拉马略", "isbn": "978-1492056355", "stock": 3, }, ] 好了,这下你感觉已经够用了,于是开始写功能: def borrow(book: dict) -> None: if book["stock"] > 0: book["stock"] -= 1 print(f"{book['title']} 借阅成功!剩余库存:{book['stock']}") else: print("库存不足!") def show_info(book: dict) -> None: print( f"《{book['title']}》,作者:{book['author']},ISBN:{book['isbn']},库存:{book['stock']}" ) def find_book(isbn: str) -> dict | None: for book in books: if book["isbn"] == isbn: return book return None book = find_book("978-1492056355") if book: show_info(book) borrow(book) else: print("未找到该书!") 不错,已经迈出第一步了。但是一个成熟的图书管理系统不仅要管理书籍,还要记录谁借了哪本书,需要追踪每本书的借阅记录,包括借阅时间和归还时间,如果书籍逾期未还,需要计算罚款,需要支持查询某用户的借阅状态。如果继续面向过程,你会发现你得再加个用户字典,用户字典里面还要套一个借过什么书的字典列表,然后书籍字典里面也得套上被谁借走了的字典列表、借阅历史字典列表,代码里会塞满一堆循环查找、条件判断和嵌套操作,牵一发而动全身。这种代码能跑是没错,但是可读性以及可维护性就比较低了。 这时候你可能会想,要是能把数据和功能捆绑在一起就好了,这时候就需要类出场了。 约定 本文基准Python版本为3.12,所有高于Python3.12的特性都需要注明。 出于时效性考虑,所有参考资料必须标注年份。 出于时效性考虑,如果参考资料与当前时间相差超过2年,则必须进行实践验证。 代码块默认代表main.py文件的内容。 以File:开头的注释代表新文件,若未指定路径,默认与 main.py 同目录。文件内容结束于注释End of file。 以Output:开头的注释代表该行代码的输出。 以Raise:开头的注释代表该行代码将会抛出的异常。 本文默认读者已经了解基本的Python面向过程编程。 基础概念 以防有人还没有接触过这些概念,在正式开始之前,我们先来对一些基本概念做一些讲解。 ...

June 18, 2025 · Raven95676