Python | 第十四章 | 基于模块开发-出租系统
P140 出租系统-基于模块开发[1] 2025/3/6
一、项目设计
- 项目设计-程序框架图:
- 在项目开发前,先进行设计,从功能上进行模块/文件划分
- 程序框架图:系统有哪些模块/文件,明确相互间的调用关系
P141 出租系统-基于模块开发[2] 2025/3/6
一、显示主菜单和完成退出软件功能
-
项目功能实现-显示主菜单和完成退出软件功能
- 化繁为简,功能拆分(一个一个功能逐步实现)
- 老师说明:实现功能的三部曲[明确完成功能->思路分析->代码实现]
-
功能说明:用户打开软件,可以看到主菜单,可以退出软件
- 思路分析:
- 在
house_operation.py
中,编写一个函数main_menu
,显示菜单。 - 在
main.py
调用 - 示意图:
- 在
-
文件代码:
main.py
:
# @Author :zjc # @File :main.py # @Time :2025/3/6 16:22 """ 说明:出租系统的主程序 """ # 导入模块house_operation # 1.直接导入此文件中的所有函数 from house_operation import * def main(): """ 这是主函数,也就是程序的执行入口 :return: """ # 调用main_menu函数显示主菜单 # 循环显示菜单,如果用户输入6就退出 while True: main_menu() key = input("请输入你的选择(1-6):") if key in ["1", "2", "3", "4", "5", "6"]: if key == "1": print("输入了1") elif key == "2": print("输入了2") elif key == "3": print() elif key == "4": print() elif key == "5": print() elif key == "6": break # 测试 if __name__ == "__main__": main() print("你退出了程序,欢迎下次使用!")
house_operation
:
# @Author :zjc # @File :house_operation.py # @Time :2025/3/6 16:23 """ 说明:提供对房屋的各种操作 """ def main_menu(): """ 显示主菜单,供用户操作和选择 :return: """ print() print("房屋出租系统".center(32,"=")) print("\t\t\t1 新 增 房 源") print("\t\t\t2 查 找 房 屋") print("\t\t\t3 删 除 房 屋 信 息") print("\t\t\t4 修 改 房 屋 信 息") print("\t\t\t5 房 屋 列 表") print("\t\t\t6 退 出")
P142 出租系统-基于模块开发[3] 2025/3/6
一、完成房屋列表的功能
- 思路分析:
- 在
house_operation.py
中,编写函数list_houses
,显示房屋信息列表 - 在
main.py
调用
- 在
main.py
中修改:
elif key == "5": # 房屋列表
list_houses()
house_operation.py
中修改:
"""
使用字典来存储房屋信息
"""
# 1.全局变量:houses 存放的所有房屋信息
# 为了测试方便,放了一个测试数据到该列表
houses = [{"id":2,"name":"tim","phone":"113","address":"海淀","rent":800,"status":"已出租"}]
def list_houses():
"""
显示房屋列表
:return:
"""
print("房屋列表".center(60,"="))
# 打印表头信息:
print("编号\t\t房主\t\t电话\t\t地址\t\t月租\t\t状态(已出租\未出租)")
# 遍历houses列表
# 取出的house就是一个字典对象
# 但是真正遍历的是字典中的values
for house in houses:
# 取出house的value值,并进行遍历显示
for value in house.values():
print(value,end="\t\t")
# 输出一个完整的house信息后,换行
print()
# 房屋列表结尾信息
print("房屋列表显示完毕".center(60,"="))
二、添加房屋信息功能
- 思路分析:
- 在
house_operation.py
中,编写函数add_house
,添加房屋信息在main.py
调用
- 在
main.py
中修改:
if key == "1": # 添加房屋
add_house()
house_operation.py
中修改:
# 全局变量id_counter 记录当前房屋的id
id_counter = 1
# 2. 添加房屋信息
def add_house():
"""
完成添加房屋信息
:return:
"""
print("添加房屋".center(32,"="))
name = input("姓名:")
phone = input("电话:")
address = input("地址:")
rent = input("租金:")
state = input("状态:")
# 由系统添加的房屋id
# global代表使用全局id_counter
global id_counter
id_counter += 1
# 构建房屋信息对应的字典,加入到全局house列表中
house = {"id":id_counter,"name":name,"phone":phone,
"address":address,"rent":rent,"status":state}
# 将信息添加到房屋
houses.append(house)
# 添加提示信息
print("添加房屋成功".center(32,"="))
P143 出租系统-基于模块开发[4] 2025/3/7
一、删除房屋信息功能
- 思路分析:
- 在
house_operation.py
中,编写函数del_house
,删除房屋信息在main.py
调用:
- 在
house_operation
:
from my_tools import *
# 3. 删除房屋信息
def del_house():
"""
根据id删除房屋信息
:return:
"""
print("删除房屋信息".center(32, "="))
del_id = int(input("请输入待删除房屋的编号(-1退出):"))
if del_id == -1:
print("放弃删除房屋信息".center(32, "="))
return
# 让用户确认删除,如果输入的不是Y/N,就一直提示输入
# while True:
# key = input("请输入你的选择(Y/N),请确认选择:")
# if key.lower() == "y" or key.lower() == "n":
# break
# 调用工具函数
choice = read_confirm_select()
if choice == "y": # 如果真的要删除
# 根据del_id 去houses列表查找是否存在该房屋[字典]
house = find_by_id(del_id)
if house:
# 不为空, 执行删除
houses.remove(house)
print("删除房屋信息成功".center(32,"="))
else:
print("房屋编号不存在,删除失败...".center(32,"="))
else:
print("你放弃删除房屋信息".center(32, "="))
my_tools
:
# @Author :zjc
# @File :my_tools.py
# @Time :2025/3/7 22:17
"""
这里编写工具函数,供程序员使用
"""
def read_confirm_select():
"""
确认用户输入的是(y/n),不区分大小写
如果用户不是输入的y/n就反复输入
:return:
"""
# 让用户确认删除,如果输入的不是Y/N,就一直提示输入
while True:
key = input("请输入你的选择(Y/N),请确认选择:")
if key.lower() == "y" or key.lower() == "n":
break
return key.lower()
main
:
elif key == "3": # 删除信息
del_house()
P144 出租系统-基于模块开发[5] 2025/3/8
一、完善退出确认
- 思路分析:
- 在
house_operation.py
中,编写函数exit_sys
,退出系统 - 在
main.py
调用将确认退出,写成一个函数(写到my_tools.py
),方便使用,提高代码复用性
- 在
main.py
:
elif key == "6": # 退出系统
if exit_sys():
break
house_operation
:
# 4.完善退出功能
def exit_sys():
"""
完成退出系统,并确认(Y/N)
:return: 如果确认退出返回True,否则返回False
"""
choice = read_confirm_select()
if choice == "y":
return True
else:
return False
my_tools
:
def read_confirm_select():
"""
确认用户输入的是(y/n),不区分大小写
如果用户不是输入的y/n就反复输入
:return:
"""
# 让用户确认删除,如果输入的不是Y/N,就一直提示输入
print("请输入你的选择(Y/N),请确认选择:", end="")
while True:
key = input()
if key.lower() == "y" or key.lower() == "n":
break
else:
print("选择错误,请重新输入:", end="")
return key.lower()
二、根据id查找房屋信息
main.py
:
elif key == "2": # 查找房屋信息
find_house()
house_operation
:
# 5.根据id查找房屋信息
def find_house():
"""
查找房屋信息
:return:
"""
print("查找房屋信息".center(32, "="))
find_id = int(input("请输入要查找的id:"))
# 调用函数返回对应的房屋信息,没有则返回None
house = find_by_id(find_id)
if house:
# 相当于找到了,显示
# 打印表头
print("编号\t\t房主\t\t电话\t\t地址\t\t月租\t\t状态(已出租\未出租)")
for value in house.values():
# 取出house的value值,并进行遍历显示
print(value, end="\t\t")
print()
else:
print(f"查找的房屋id{find_id}不存在")
P145 出租系统-基于模块开发[6] 2025/3/9
一、修改房屋信息功能
- 思路分析:
- 在
house_operation.py
中,编写函数update
,修改房屋信息在main.py
调用:
- 在
二、代码总结
main.py
;
# @Author :zjc
# @File :main.py
# @Time :2025/3/6 16:22
"""
说明:出租系统的主程序
"""
# 导入模块house_operation
# 1.直接导入此文件中的所有函数
from house_operation import *
def main():
"""
这是主函数,也就是程序的执行入口
:return:1
"""
# 调用main_menu函数显示主菜单
# 循环显示菜单,如果用户输入6就退出
while True:
main_menu()
key = input("请输入你的选择(1-6):")
if key in ["1", "2", "3", "4", "5", "6"]:
if key == "1": # 添加房屋
add_house()
elif key == "2": # 查找房屋信息
find_house()
elif key == "3": # 删除信息
del_house()
elif key == "4": # 修改房屋信息
update()
elif key == "5": # 房屋列表
list_houses()
elif key == "6": # 退出系统
if exit_sys():
break
# 测试
if __name__ == "__main__":
main()
print("你退出了程序,欢迎下次使用!")
my_tools.py
:
# @Author :zjc
# @File :my_tools.py
# @Time :2025/3/7 22:17
"""
这里编写工具函数,供程序员使用
"""
def read_str(tip,default_val):
"""
读取用户输入,如果用户没有输入内容,则返回默认值
:param tip: 提示信息
:param default_val: 用户指定
:return: 返回的就是需要的新数据
"""
str = input(tip)
if len(str) > 0:
return str
else:
return default_val
def read_confirm_select():
"""
确认用户输入的是(y/n),不区分大小写
如果用户不是输入的y/n就反复输入
:return:
"""
# 让用户确认删除,如果输入的不是Y/N,就一直提示输入
print("请输入你的选择(Y/N),请确认选择:", end="")
while True:
key = input()
if key.lower() == "y" or key.lower() == "n":
break
else:
print("选择错误,请重新输入:", end="")
return key.lower()
house_operation.py
:
# @Author :zjc
# @File :house_operation.py
# @Time :2025/3/6 16:23
from my_tools import *
"""
说明:提供对房屋的各种操作
"""
# 全局变量:houses 存放的所有房屋信息
# 为了测试方便,放了一个测试数据到该列表
houses = [{"id": 1, "name": "tim", "phone": "113", "address": "海淀", "rent": 800, "status": "已出租"}]
# 全局变量id_counter 记录当前房屋的id
id_counter = 1
# 6. 更新房屋信息
def update():
"""
修改房屋信息
:return:
"""
update_id = int(input("请选择待修改的房屋编号(-1表示退出):"))
if update_id == -1:
print("你放弃修改房屋信息".center(32, "="))
return
# 根据id查找到对应的房屋信息(字典)
house = find_by_id(update_id)
if not house:
print("没有要修改的房屋信息".center(32, "="))
return
# 注意:如果用户直接回车表示不修改当前这个信息,保留原来的值
""" 按照简单的方式完成:
name = input(f"姓名({house['name']})")
if len(name) > 0: # 如果用户输入的有内容才修改
# 表示将接受到的name,赋值给字典对应的key="name"对应的值
house['name'] = name
"""
# 编写工具函数替换前面的
house['name'] = read_str(f"姓名({house['name']})",house['name'])
house['phone'] = read_str(f"电话({house['phone']})", house['phone'])
house['address'] = read_str(f"地址({house['address']})", house['address'])
house['rent'] = int(read_str(f"租金({house['rent']})", house['rent']))
house['status'] = read_str(f"状态({house['status']})", house['status'])
print("修改房屋信息成功".center(32,"="))
# 5.根据id查找房屋信息
def find_house():
"""
查找房屋信息
:return:
"""
print("查找房屋信息".center(32, "="))
find_id = int(input("请输入要查找的id:"))
# 调用函数返回对应的房屋信息,没有则返回None
house = find_by_id(find_id)
if house:
# 相当于找到了,显示
# 打印表头
print("编号\t\t房主\t\t电话\t\t地址\t\t月租\t\t状态(已出租\未出租)")
for value in house.values():
# 取出house的value值,并进行遍历显示
print(value, end="\t\t")
print()
else:
print(f"查找的房屋id{find_id}不存在")
# 4.完善退出功能
def exit_sys():
"""
完成退出系统,并确认(Y/N)
:return: 如果确认退出返回True,否则返回False
"""
choice = read_confirm_select()
if choice == "y":
return True
else:
return False
# 3. 删除房屋信息
def del_house():
"""
根据id删除房屋信息
:return:
"""
print("删除房屋信息".center(32, "="))
del_id = int(input("请输入待删除房屋的编号(-1退出):"))
if del_id == -1:
print("放弃删除房屋信息".center(32, "="))
return
# 让用户确认删除,如果输入的不是Y/N,就一直提示输入
# while True:
# key = input("请输入你的选择(Y/N),请确认选择:")
# if key.lower() == "y" or key.lower() == "n":
# break
# 调用工具函数
choice = read_confirm_select()
if choice == "y": # 如果真的要删除
# 根据del_id 去houses列表查找是否存在该房屋[字典]
house = find_by_id(del_id)
if house:
# 不为空, 执行删除
houses.remove(house)
print("删除房屋信息成功".center(32, "="))
else:
print("房屋编号不存在,删除失败...".center(32, "="))
else:
print("你放弃删除房屋信息".center(32, "="))
# 2. 添加房屋信息
def add_house():
"""
完成添加房屋信息
:return:
"""
print("添加房屋".center(32, "="))
name = input("姓名:")
phone = input("电话:")
address = input("地址:")
rent = input("租金:")
state = input("状态:")
# 由系统添加的房屋id
# global代表使用全局id_counter
global id_counter
id_counter += 1
# 构建房屋信息对应的字典,加入到全局house列表中
house = {"id": id_counter, "name": name, "phone": phone,
"address": address, "rent": rent, "status": state}
# 将信息添加到房屋
houses.append(house)
# 添加提示信息
print("添加房屋成功".center(32, "="))
# 1. 显示房屋信息
"""
使用字典来存储房屋信息
"""
def list_houses():
"""
显示房屋列表
:return:
"""
print("房屋列表".center(60, "="))
# 打印表头信息:
print("编号\t\t房主\t\t电话\t\t地址\t\t月租\t\t状态(已出租\未出租)")
# 遍历houses列表
# 取出的house就是一个字典对象
# 但是真正遍历的是字典中的values
for house in houses:
# 取出house的value值,并进行遍历显示
for value in house.values():
print(value, end="\t\t")
# 输出一个完整的house信息后,换行
print()
# 房屋列表结尾信息
print("房屋列表显示完毕".center(60, "="))
# 0. 显示主菜单
def main_menu():
"""
显示主菜单,供用户操作和选择
:return:
"""
print()
print("房屋出租系统".center(32, "="))
print("\t\t\t1 新 增 房 源")
print("\t\t\t2 查 找 房 屋")
print("\t\t\t3 删 除 房 屋 信 息")
print("\t\t\t4 修 改 房 屋 信 息")
print("\t\t\t5 房 屋 列 表")
print("\t\t\t6 退 出")
# 0. 查找ID
def find_by_id(find_id):
"""
根据输入的find_id返回对应的房屋信息(字典),如果没有,就返回None
:param find_id:
:return:
"""
# 遍历houses列表
for house in houses:
if house["id"] == find_id:
return house
# 没有找到直接返回None,如果没有return也是默认返回None
return None
P146 出租系统-OPP分层模式 [1] 2025/3/11
一、项目设计
-
项目设计-程序框架图:
- 分层模式=>当软件比较复杂,需要模式管理
- 程序框架图
- 分析设计系统有哪些类
- 明确各个类的调用关系
P147 出租系统-OPP分层模式 [2] 2025/3/11
一、完成House类
二、显示主菜单和完成退出软件功能
main.py
:
# @Author :zjc
# @File :main.py
# @Time :2025/3/11 20:06
"""
说明:主程序,程序的执行入口
"""
from house_view import *
if __name__== "__main__":
# 创建HouseView对象,显示主菜单
HouseView().main_menu()
print("你退出了程序,欢迎下次使用...")
house_view.py
:
# @Author :zjc
# @File :house_view.py
# @Time :2025/3/11 19:59
"""
说明:界面层,显示界面,接收用户的输入,调用业务层的方法
"""
class HouseView:
def main_menu(self):
"""
显示主菜单
:return:
"""
while True:
print()
print("房屋出租系统".center(32, "="))
print("\t\t\t1 新 增 房 源")
print("\t\t\t2 查 找 房 屋")
print("\t\t\t3 删 除 房 屋 信 息")
print("\t\t\t4 修 改 房 屋 信 息")
print("\t\t\t5 房 屋 列 表")
print("\t\t\t6 退 出")
key = input("请输入你的选择(1-6):")
if key in ["1", "2", "3", "4", "5", "6"]:
if key == "1": # 添加房屋
print("1 新 增 房 源")
elif key == "2": # 查找房屋信息
print("2 查 找 房 屋")
elif key == "3": # 删除信息
print("3 删 除 房 屋 信 息")
elif key == "4": # 修改房屋信息
print("4 修 改 房 屋 信 息")
elif key == "5": # 房屋列表
print("5 房 屋 列 表")
elif key == "6": # 退出系统
break
house.py
:
# @Author :zjc
# @File :house.py.py
# @Time :2025/3/11 19:50
"""
说明:数据层: House类,一个House对象表示一个房屋信息
"""
class House:
def __init__(self,id,name,phone,address,rent,state):
self.id = id
self.name = name
self.phone = phone
self.address = address
self.rent = rent
self.state = state
P148 出租系统-OPP分层模式 [3] 2025/3/11
一、完成显示房屋列表的功能
house_view.py
:
# 1. 显示房屋列表
def list_houses(self):
"""
显示房屋列表
:return:
"""
print("房屋列表".center(60, "="))
# 打印表头信息:
print("编号\t\t房主\t\t电话\t\t地址\t\t月租\t\t状态(已出租\未出租)")
# 得到house列表
houses = self.house_operation.get_houses()
# 遍历houses列表,元素为每个类(对象),直接输出为地址,需要重写__str__方法
for house in houses:
print(house) # 先看看效果
# 房屋列表结尾信息
print("房屋列表显示完毕".center(60, "="))
house_service.py
:
def get_houses(self):
"""
返回房屋列表
:return:
"""
return self.houses
house.py
:
# 重写__str__方法, 按照指定的格式输出对象
def __str__(self):
return f"{self.id}\t\t{self.name}\t\t{self.phone}\t\t{self.address}\t\t{self.rent}\t\t{self.state}"
P149 出租系统-OPP分层模式 [4] 2025/3/11
一、添加房屋信息功能
house_service.py
:
# 定义属性id_counter:记录当前房屋的id
id_counter = 1
def add(self, new_house:House):
"""
将接受到的new_house添加到houses
:param new_house:
:return:
"""
# 分配id给new_house
self.id_counter += 1
new_house.id = self.id_counter
self.houses.append(new_house)
house_view.py
:
# 2.添加房屋
def add_house(self):
"""
显示添加的界面,接收用户的确认,构建House对象
:return:
"""
print("添加房屋".center(32, "="))
name = input("姓名:")
phone = input("电话:")
address = input("地址:")
rent = input("租金:")
state = input("状态:")
# 构建房屋对象
new_house = House(0,name,phone,address,rent,state)
# 调用service方法,添加new_house
self.house_operation.add(new_house)
# 添加提示信息
print("添加房屋成功".center(32, "="))