(Python)类的练习与巩固(图书管理系统)(类与方法的基础教程)(if条件扩展)(动态类型)(Python教程)
源代码:
class Book:def __init__(self,title,author,publisher,is_borrowed=False):self.title=titleself.author=authorself.publisher=publisherself.is_borrowed=is_borroweddef show_info(self):status="已借出"if self.is_borrowed==True else"未借出"print(f"书名:《{self.title}》")print(f"作者:{self.author}")print(f"出版社:{self.publisher}")print(f"状态:{status}")def borrow_book(self):if self.is_borrowed==False:self.is_borrowed=True print(f"《{self.title}》已经成功借出")else:print(f"抱歉《{self.title}》已经借出,无法再次借出")def return_book(self):if self.is_borrowed==True:self.is_borrowed=Falseprint(f"《{self.title}》已经成功归还")else:print(f"抱歉《{self.title}》未曾借出,无需归还")def is_available(self):if self.is_borrowed==False :print(f"《{self.title}》未曾借出")else:print(f"抱歉《{self.title}》已经借出")python_book = Book("Python入门","张三","编程出版社")
print("初始信息:")
python_book.show_info()
python_book.borrow_book()
print("\n借出后的信息:")
python_book.show_info()
python_book.borrow_book()
python_book.is_available()
python_book.return_book()
python_book.is_available()
代码详解:
练习目标
创建一个 Book
类,实现以下功能:
- 初始化图书的基本信息:书名、作者、出版社、当前是否被借出(默认为 “未借出”)
- 能打印图书的所有信息
- 能修改图书的借出状态(借出 / 归还)
- 能查询图书是否可借(如果未借出则可借)
步骤引导
第一步:创建类并定义初始化方法
首先用 class
关键字创建 Book
类,在 __init__
方法中定义图书的属性:
- 书名、作者、出版社是必须提供的信息
- 借出状态有默认值(比如 “未借出”)
class Book:# 初始化方法:self是必须的,代表实例本身def __init__(self, title, author, publisher, is_borrowed=False):# 给实例绑定属性self.title = title # 书名self.author = author # 作者self.publisher = publisher # 出版社self.is_borrowed = is_borrowed # 是否被借出,默认False(未借出)
(这里用 False
表示未借出,True
表示已借出,后续判断更方便)
第二步:添加打印图书信息的方法
需要一个方法来展示图书的完整信息,包括书名、作者、出版社和借出状态。
方法名可以叫 show_info
,记得带 self
参数。
class Book:def __init__(self, title, author, publisher, is_borrowed=False):self.title = titleself.author = authorself.publisher = publisherself.is_borrowed = is_borrowed# 打印图书信息的方法def show_info(self):# 处理借出状态的文字描述status="已借出"if self.is_borrowed==True else"未借出"print(f"书名:《{self.title}》")print(f"作者:{self.author}")print(f"出版社:{self.publisher}")print(f"状态:{status}")
第三步:添加修改借出状态的方法
需要两个方法分别处理 “借出” 和 “归还” 操作:
borrow_book()
:将状态改为 “已借出”return_book()
:将状态改为 “未借出”
class Book:def __init__(self, title, author, publisher, is_borrowed=False):self.title = titleself.author = authorself.publisher = publisherself.is_borrowed = is_borroweddef show_info(self):status="已借出"if self.is_borrowed==True else"未借出"print(f"书名:《{self.title}》")print(f"作者:{self.author}")print(f"出版社:{self.publisher}")print(f"状态:{status}")# 借出图书的方法def borrow_book(self):if self.is_borrowed==False: # 如果当前未借出self.is_borrowed = Trueprint(f"《{self.title}》已成功借出!")else: # 如果已经借出print(f"抱歉,《{self.title}》目前已被借出,无法再次借出。")# 归还图书的方法def return_book(self):if self.is_borrowed==True: # 如果当前已借出self.is_borrowed = Falseprint(f"《{self.title}》已成功归还!")else: # 如果本来就未借出print(f"《{self.title}》本来就未借出,无需归还。")
第四步:添加查询可借状态的方法
需要一个方法判断图书是否可借(即当前未借出),返回 True
或 False
。
方法名可以叫 is_available
。
class Book:def __init__(self, title, author, publisher, is_borrowed=False):self.title = titleself.author = authorself.publisher = publisherself.is_borrowed = is_borroweddef show_info(self):status="已借出"if self.is_borrowed==True else"未借出"print(f"书名:《{self.title}》")print(f"作者:{self.author}")print(f"出版社:{self.publisher}")print(f"状态:{status}")def borrow_book(self):if if self.is_borrowed==False:self.is_borrowed = Trueprint(f"《{self.title}》已成功借出!")else:print(f"抱歉,《{self.title}》目前已被借出,无法再次借出。")def return_book(self):if if self.is_borrowed==True:self.is_borrowed = Falseprint(f"《{self.title}》已成功归还!")else:print(f"《{self.title}》本来就未借出,无需归还。")# 查询是否可借的方法def is_available(self):if self.is_borrowed==False :print(f"《{self.title}》未曾借出")else:print(f"抱歉《{self.title}》已经借出")
第五步:创建实例并测试
现在我们的 Book
类完成了,来创建一本图书实例,测试所有功能:
# 创建一本图书:《Python入门》,作者"张三",出版社"编程出版社"
python_book = Book("Python入门", "张三", "编程出版社")# 打印图书信息
print("初始信息:")
python_book.show_info() # 应该显示状态为"未借出"# 尝试借出这本书
python_book.borrow_book() # 应该提示"已成功借出"# 再次打印信息,确认状态变化
print("\n借出后的信息:")
python_book.show_info() # 状态应该变为"已借出"# 尝试再次借出(应该失败)
python_book.borrow_book() # 应该提示"已被借出"# 查询是否可借(此时应该不可借)
python_book.is_available()# 归还图书
python_book.return_book() # 应该提示"已成功归还"# 再次查询是否可借(此时应该可借)
python_book.is_available()
多说一句(重点代码解析):
status="已借出"if self.is_borrowed==True else"未借出" 什么意思?
这行代码是 Python 的三元表达式,是一种简洁的条件判断写法,作用是根据 self.is_borrowed
的值来给 status
变量赋值。
我们可以拆成普通的 if-else
语句来理解:
# 和这行代码完全等价
if self.is_borrowed == True:status = "已借出" # 如果条件成立,status 就是"已借出"
else:status = "未借出" # 如果条件不成立,status 就是"未借出"
进一步简化
因为 self.is_borrowed
本身就是布尔值(True
或 False
),所以可以省略 == True
,直接写成:
status = "已借出" if self.is_borrowed else "未借出"
意思不变,但更简洁。
三元表达式的格式是:
变量 = 条件成立时的值 if 条件 else 条件不成立时的值
这行代码的目的就是:根据图书是否被借出(self.is_borrowed
),用中文文字(“已借出” 或 “未借出”)来描述状态,方便后续打印显示。
False为啥不用定义bool?
在 Python 中,is_borrowed=False
这样的写法里,False
本身就是 布尔类型(bool)的字面量,不需要专门声明它的类型,这是 Python 的一个重要特性 ——动态类型。
具体原因:
Python 是动态类型语言
和某些静态类型语言(如 Java、C++)不同,Python 不需要在定义变量或参数时声明类型。解释器会自动根据赋值来判断变量的类型。
比如:is_borrowed=False
中,False
是布尔值,所以 Python 会自动认定is_borrowed
是布尔类型。- 如果你写
x=10
,Python 会自动认为x
是整数;y="hello"
会被认为是字符串。
False
是 Python 内置的布尔值True
和False
是 Python 提前定义好的布尔类型常量,它们本身就代表 “真” 和 “假”,不需要额外定义类型。
就像123
是整数、"abc"
是字符串一样,False
天生就是布尔类型。参数默认值的作用
这里的is_borrowed=False
有两个作用:- 设定默认值:如果创建
Book
实例时不提供is_borrowed
参数,它会自动取False
(未借出)。 - 暗示类型:虽然不强制,但默认值
False
已经清晰地告诉使用者,这个参数应该传入布尔值(True
或False
)。
- 设定默认值:如果创建
举个例子对比:
如果在静态类型语言(如 Java)中,可能需要这样写(明确声明类型):
// Java 代码(需要声明 boolean 类型)
public class Book {boolean isBorrowed;// 构造方法public Book(String title, String author, String publisher, boolean isBorrowed) {this.isBorrowed = isBorrowed;}// 默认值构造方法public Book(String title, String author, String publisher) {this.isBorrowed = false; // 明确 boolean 类型的 false}
}
而 Python 因为动态类型的特性,一行 is_borrowed=False
就同时完成了 “设定默认值” 和 “确定类型” 的功能,更简洁。
简单说就是:Python 会识别 False
是布尔类型,所以不用我们手动声明
f方法介绍:
基本用法
在字符串前加字母 f
或 F
,然后用 {}
包裹变量或表达式,Python 会自动计算并替换其中的内容。
示例 1:嵌入变量
name = "小明"
age = 18
# 使用 f-string 拼接变量
info = f"姓名:{name},年龄:{age}"
print(info) # 输出:姓名:小明,年龄:18
示例 2:嵌入表达式
不仅可以放变量,还能直接放计算、函数调用等表达式:
a = 10
b = 20
# 嵌入算术运算
result = f"{a} + {b} = {a + b}"
print(result) # 输出:10 + 20 = 30# 嵌入函数调用
text = "hello"
upper_text = f"大写:{text.upper()}"
print(upper_text) # 输出:大写:HELLO
和其他格式化方式的对比
相比传统的 %
格式化或 str.format()
,f - 字符串更简洁直观:
name = "小红"
age = 20# 传统 % 格式化
print("姓名:%s,年龄:%d" % (name, age))# str.format() 方法
print("姓名:{},年龄:{}".format(name, age))# f-string(最简洁)
print(f"姓名:{name},年龄:{age}")
注意事项
引号冲突:如果字符串内有引号,和外层引号区分开(比如外层用双引号,内层用单引号):
sentence = f'他说:"我叫{name}"' # 正确
花括号转义:如果需要在字符串中显示
{
或}
,用两个花括号{{
或}}
:print(f"计算结果:{{{a + b}}}") # 输出:计算结果:{30}
f - 字符串是 Python 中最常用的字符串格式化方式,因为它简单、直观且效率高,特别适合在类的方法中拼接属性(比如你之前写的 show_info
方法中就用到了)。
注:该代码是本人自己所写,可能不够好,不够简便,欢迎大家指出我的不足之处。如果遇见看不懂的地方,可以在评论区打出来,进行讨论,或者联系我。上述内容全是我自己理解的,如果你有别的想法,或者认为我的理解不对,欢迎指出!!!如果可以,可以点一个免费的赞支持一下吗?谢谢各位彦祖亦菲!!!!!