Python 简单的银行系统(完整教程)

从零开始构建 Python 简单的银行系统

你有没有想过,自己动手写一个“银行系统”?别被这个词吓到——它并不是要你实现 ATM 机、账户加密、分布式事务。我们今天要做的是一个逻辑清晰、结构完整、适合初学者上手的 Python 简单的银行系统

这个系统虽然小,但包含了面向对象编程的核心思想:封装、继承、多态。它能让你理解“类”是如何模拟现实世界中的“账户”“用户”“交易”等概念的。

想象一下,你去银行开户,柜员会问你名字、身份证号,然后给你一张卡和一个账号。你存钱、取钱、查余额,这些操作背后,其实都是“对象”在动。Python 的类,就是帮我们把这种“现实行为”变成代码。

接下来,我们就一步步搭建这个系统,让你从零开始,写出真正能运行的代码。


设计系统核心结构

在写代码前,先理清思路。一个“银行系统”至少需要几个核心部分:

  • 用户(User):有姓名、身份证号、账户
  • 账户(Account):有账号、余额、密码、状态
  • 交易记录(Transaction):每次存取钱都留下记录
  • 银行(Bank):管理所有账户,提供存取服务

这就像一个小型“数据仓库”,每个用户对应一个账户,银行是管理员。

我们先定义“账户”类,它是整个系统的基石。


创建账户类 Account

class Account:
    # 类变量:记录所有账户的总数
    total_accounts = 0

    def __init__(self, account_number, owner_name, initial_balance=0, password="123456"):
        # 实例变量:每个账户独有的属性
        self.account_number = account_number      # 账号,唯一标识
        self.owner_name = owner_name              # 持有人姓名
        self.balance = initial_balance            # 初始余额
        self.password = password                  # 登录密码(简化版)
        self.is_active = True                     # 账户是否激活
        self.transaction_history = []             # 交易记录列表
        Account.total_accounts += 1               # 每创建一个账户,总数加1

    def deposit(self, amount):
        """存钱方法:向账户存入指定金额"""
        if amount <= 0:
            print("❌ 存款金额必须大于 0")
            return False
        if not self.is_active:
            print("❌ 账户已冻结,无法存款")
            return False
        self.balance += amount
        # 记录交易:时间、类型、金额、余额
        self.transaction_history.append({
            "type": "存款",
            "amount": amount,
            "balance_after": self.balance,
            "timestamp": "2025-04-05 10:30:00"
        })
        print(f"✅ 成功存款 {amount} 元,当前余额:{self.balance} 元")
        return True

    def withdraw(self, amount):
        """取款方法:从账户取出指定金额"""
        if amount <= 0:
            print("❌ 取款金额必须大于 0")
            return False
        if not self.is_active:
            print("❌ 账户已冻结,无法取款")
            return False
        if amount > self.balance:
            print(f"❌ 余额不足!当前余额:{self.balance} 元")
            return False
        self.balance -= amount
        self.transaction_history.append({
            "type": "取款",
            "amount": amount,
            "balance_after": self.balance,
            "timestamp": "2025-04-05 10:31:00"
        })
        print(f"✅ 成功取款 {amount} 元,当前余额:{self.balance} 元")
        return True

    def check_balance(self):
        """查询余额"""
        print(f"📊 账户余额:{self.balance} 元")
        return self.balance

    def get_transaction_history(self):
        """查看交易记录"""
        if not self.transaction_history:
            print("📭 暂无交易记录")
            return
        print("\n📜 交易记录:")
        for i, record in enumerate(self.transaction_history, 1):
            print(f"  {i}. {record['type']} | 金额:{record['amount']} 元 | 余额:{record['balance_after']} 元 | 时间:{record['timestamp']}")

💡 小贴士self 就像“我”这个词,每个账户都有自己的“我”(属性),比如余额、密码。__init__ 是“初始化方法”,就像你开户时填资料。


创建用户类 User

用户是账户的主人,我们让每个用户可以拥有一个或多个账户。

class User:
    def __init__(self, name, id_number):
        self.name = name
        self.id_number = id_number
        self.accounts = []  # 一个用户可以有多个账户

    def add_account(self, account):
        """为用户添加一个账户"""
        self.accounts.append(account)
        print(f"👤 用户 {self.name} 已成功添加账户 {account.account_number}")

    def find_account(self, account_number):
        """根据账号查找账户"""
        for acc in self.accounts:
            if acc.account_number == account_number:
                return acc
        print(f"❌ 找不到账号为 {account_number} 的账户")
        return None

    def show_all_accounts(self):
        """显示用户所有账户信息"""
        if not self.accounts:
            print("📭 该用户暂无账户")
            return
        print(f"\n📋 {self.name} 的账户列表:")
        for acc in self.accounts:
            status = "✅ 激活" if acc.is_active else "❌ 冻结"
            print(f"  账号:{acc.account_number} | 余额:{acc.balance} 元 | {status}")

创建银行类 Bank

银行是系统的“总管”,负责管理所有用户和账户。

class Bank:
    def __init__(self, name):
        self.name = name
        self.users = {}  # 用字典存储用户,以身份证号为键

    def register_user(self, name, id_number):
        """注册新用户"""
        if id_number in self.users:
            print("❌ 该身份证号已注册")
            return None
        user = User(name, id_number)
        self.users[id_number] = user
        print(f"✅ 用户 {name} 注册成功,身份证号:{id_number}")
        return user

    def login_user(self, id_number, password):
        """用户登录:验证身份证号和密码"""
        if id_number not in self.users:
            print("❌ 用户不存在")
            return None
        user = self.users[id_number]
        # 这里简化处理:直接遍历所有账户验证密码
        # 实际系统会用加密存储
        for account in user.accounts:
            if account.password == password:
                print(f"🔐 登录成功!欢迎 {user.name}")
                return user, account
        print("❌ 密码错误")
        return None, None

    def get_user_accounts(self, id_number):
        """获取用户所有账户"""
        if id_number not in self.users:
            print("❌ 用户不存在")
            return []
        return self.users[id_number].accounts

模拟真实使用场景

现在,我们来运行一个完整的流程,看看这个 Python 简单的银行系统如何工作。

my_bank = Bank("中国未来银行")

user1 = my_bank.register_user("张三", "110101199001011234")
user2 = my_bank.register_user("李四", "110101199102022345")

account1 = Account("A001", "张三", 1000, "123456")
account2 = Account("A002", "李四", 500, "654321")

user1.add_account(account1)
user2.add_account(account2)

logged_user, logged_account = my_bank.login_user("110101199001011234", "123456")

if logged_account:
    # 模拟操作
    logged_account.deposit(200)
    logged_account.withdraw(150)
    logged_account.check_balance()
    logged_account.get_transaction_history()

运行结果如下:

✅ 用户 张三 注册成功,身份证号:110101199001011234
✅ 用户 李四 注册成功,身份证号:110101199102022345
👤 用户 张三 已成功添加账户 A001
👤 用户 李四 已成功添加账户 A002
🔐 登录成功!欢迎 张三
✅ 成功存款 200 元,当前余额:1200 元
✅ 成功取款 150 元,当前余额:1050 元
📊 账户余额:1050 元

📜 交易记录:
  1. 存款 | 金额:200 元 | 余额:1200 元 | 时间:2025-04-05 10:30:00
  2. 取款 | 金额:150 元 | 余额:1050 元 | 时间:2025-04-05 10:31:00

代码结构分析与设计原则

我们用到了几个关键编程思想:

  • 封装:把数据和方法打包在类中,比如 Account 类封装了余额、存取操作。
  • 模块化:每个类职责单一,银行管用户,账户管钱,用户管账户。
  • 可扩展性:以后可以加“冻结账户”“转账”“利息计算”功能,只需扩展类。

这就像搭积木,每个模块独立,组合起来就能完成复杂任务。


常见问题与优化建议

问题 解决方案
密码明文存储 使用哈希加密(如 hashlib
账号重复 用集合或字典管理账号唯一性
交易时间固定 改用 datetime.now() 动态获取
多用户并发 后续可引入线程锁(threading.Lock

✅ 建议:在生产环境中,绝不直接把密码存成明文。这里只是为了教学简化。


总结与延伸思考

通过这个 Python 简单的银行系统,我们不仅学会了如何用类组织代码,还理解了真实系统中“用户-账户-交易”三者的关系。

它虽然简单,但结构完整,是学习面向对象编程的绝佳范例。如果你能独立写出这个系统,说明你已经掌握了 Python 的核心能力。

下一步,你可以尝试:

  • 加入“转账”功能,实现两个账户之间的资金转移
  • json 文件保存账户数据,实现持久化
  • 添加图形界面(tkinter)或 Web 接口(Flask

记住,每一个复杂系统,都是从一个“小银行”开始的。

当你再次看到“Python 简单的银行系统”这个词时,希望你不再觉得它遥远——它就在你写的每一行代码里。