当前位置: 首页 > news >正文

Python | 第十四章 | 基于模块开发-出租系统

P140 出租系统-基于模块开发[1] 2025/3/6

一、项目设计

  • 项目设计-程序框架图
    1. 在项目开发前,先进行设计,从功能上进行模块/文件划分
    2. 程序框架图:系统有哪些模块/文件,明确相互间的调用关系

image-20250306161600891

P141 出租系统-基于模块开发[2] 2025/3/6

一、显示主菜单和完成退出软件功能

  • 项目功能实现-显示主菜单和完成退出软件功能

    • 化繁为简,功能拆分(一个一个功能逐步实现)
    • 老师说明:实现功能的三部曲[明确完成功能->思路分析->代码实现]
  • 功能说明:用户打开软件,可以看到主菜单,可以退出软件

image-20250306161855187

  • 思路分析
    • house_operation.py中,编写一个函数main_menu,显示菜单。
    • main.py调用
    • 示意图:

image-20250306165248517

  • 文件代码

    • 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

一、完成房屋列表的功能

image-20250306205404089

  • 思路分析
    • house_operation.py中,编写函数list_houses,显示房屋信息列表
    • main.py 调用

image-20250306205530327

  • 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,"="))

二、添加房屋信息功能

image-20250306211145117

  • 思路分析
    • house_operation.py中,编写函数add_house,添加房屋信息在main.py 调用

image-20250306211708469

  • 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

一、删除房屋信息功能

image-20250307213344337

  • 思路分析
    • house_operation.py中,编写函数del_house,删除房屋信息在main.py 调用:

image-20250307213640662

  • 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

一、完善退出确认

image-20250308211049351

  • 思路分析
    • house_operation.py中,编写函数exit_sys,退出系统
    • main.py调用将确认退出,写成一个函数(写到my_tools.py),方便使用,提高代码复用性

image-20250308211822346

  • 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查找房屋信息

image-20250308222124588

image-20250308222411988

  • 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

一、修改房屋信息功能

image-20250309214351960

  • 思路分析
    • house_operation.py中,编写函数update,修改房屋信息在main.py调用:

image-20250309214630645

二、代码总结

  • 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

一、项目设计

  • 项目设计-程序框架图

    • 分层模式=>当软件比较复杂,需要模式管理
    • 程序框架图
      • 分析设计系统有哪些类
      • 明确各个类的调用关系

    image-20250311194704968

    image-20250311194832805

P147 出租系统-OPP分层模式 [2] 2025/3/11

一、完成House类

image-20250311195647300

二、显示主菜单和完成退出软件功能

image-20250311195821518

image-20250311195924838

  • 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

一、完成显示房屋列表的功能

image-20250311201321734

image-20250311201536473

  • 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

一、添加房屋信息功能

image-20250311210510808

image-20250311211017805

  • 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, "="))
http://www.dtcms.com/a/121996.html

相关文章:

  • 如何设置 JVM 内存参数(-Xms、-Xmx、-Xss 等)?
  • 文件的操作
  • 自然语言处理入门6——RNN生成文本
  • 揭开 MCP 的神秘面纱:标准化 AI 上下文管理的未来(下)
  • 永磁同步电机 | 分类 / 转子结构 / FOC 控制 / 电路分析
  • Android 中集成 Unity 工程的步骤
  • 点云处理常用的软件、开源库及数据集
  • 将jar包制作成deb一键安装包
  • 从 Excel 到你的表格应用:条件格式功能的嵌入实践指南
  • 【机密计算顶会解读】13:CAGE:通过 GPU 扩展补充 Arm CCA
  • 2025年3月全国青少年软件编程等级考试(Python五级)试卷及答案
  • 图解Java设计模式
  • 005.Gitlab CICD变量使用
  • oauth2.0认证原理
  • word表格间隔设置
  • C++20 数学常数:<numbers> 头文件的革新
  • cmd清除网络共享连接凭证
  • C++高精度算法(加、减、乘)
  • 【C++】 —— 笔试刷题day_13
  • 抽象类及其特性
  • cpp(c++)win 10编译GDAL、PROJ、SQLite3、curl、libtiff
  • Easysearch VS Opensearch 数据写入与存储性能对比
  • HOW - 实现 useClickOutside 或者 useClickAway
  • 大模型本地部署系列(1) Ollama的安装与配置
  • 神经网络 | 基于脉冲耦合神经网络PCNN图像特征提取与匹配(附matlab代码)
  • 408 计算机网络 知识点记忆(6)
  • Elasticsearch DSL 中的 aggs 聚合分析
  • 数据结构实验3.3:求解迷宫路径问题
  • 西门子S7-1500与S7-200SMART通讯全攻略:从基础配置到远程IO集成
  • SQL注入(SQL Injection)