news 2026/4/18 5:38:53

银行卡余额模拟器,如何用Python弄一比一,仅供娱乐装逼学习哈!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
银行卡余额模拟器,如何用Python弄一比一,仅供娱乐装逼学习哈!

文件下载地址【带源码】:https://wenshushu.vip/download/index.php?id=37 提取码:5e81

不知道大家有没有想过,如果能“自定义”自己的银行卡余额该多好?当然,这只是个玩笑!今天我将带大家用Python制作一个“银行卡余额模拟器”,纯粹用于编程学习、娱乐和了解金融系统的基本逻辑。通过这个项目,你将学到Python面向对象编程、文件操作、数据加密等实用技能。

一、项目概述

功能特性

· 模拟银行账户创建和管理
· 存款、取款、转账功能
· 交易记录查询
· 数据本地加密存储
· 精美的终端界面

技术栈

· Python 3.8+
· 面向对象编程
· JSON数据存储
· 基础加密技术
· 终端颜色输出

二、项目结构

```
bank_simulator/
├── bank_system.py # 主程序
├── accounts.json # 账户数据存储
└── README.md # 项目说明
```

三、代码实现

3.1 账户类设计

首先,我们创建一个BankAccount类来表示银行账户:

```python
import json
import os
from datetime import datetime
import hashlib
from getpass import getpass
import sys

class BankAccount:
"""银行账户类"""

def __init__(self, account_number, account_name, initial_balance=0.0, password=None):
"""
初始化银行账户

参数:
account_number: 账户号码
account_name: 账户持有人姓名
initial_balance: 初始余额
password: 账户密码
"""
self.account_number = account_number
self.account_name = account_name
self.balance = initial_balance
self.password_hash = self._hash_password(password) if password else None
self.transactions = []
self.creation_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# 记录初始存款
if initial_balance > 0:
self.add_transaction("初始存款", initial_balance, "存款")

def _hash_password(self, password):
"""对密码进行哈希处理"""
return hashlib.sha256(password.encode()).hexdigest()

def verify_password(self, password):
"""验证密码"""
if not self.password_hash:
return True # 如果没有设置密码,则默认通过
return self._hash_password(password) == self.password_hash

def add_transaction(self, description, amount, transaction_type):
"""添加交易记录"""
transaction = {
"date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"description": description,
"amount": amount,
"type": transaction_type,
"balance_after": self.balance
}
self.transactions.append(transaction)
# 只保留最近100条交易记录
if len(self.transactions) > 100:
self.transactions = self.transactions[-100:]

def deposit(self, amount):
"""存款"""
if amount <= 0:
return False, "存款金额必须大于0"

self.balance += amount
self.add_transaction("存款", amount, "存款")
return True, f"存款成功!当前余额: ¥{self.balance:,.2f}"

def withdraw(self, amount):
"""取款"""
if amount <= 0:
return False, "取款金额必须大于0"

if amount > self.balance:
return False, "余额不足"

self.balance -= amount
self.add_transaction("取款", amount, "取款")
return True, f"取款成功!当前余额: ¥{self.balance:,.2f}"

def get_statement(self, last_n=10):
"""获取交易流水"""
if not self.transactions:
return "暂无交易记录"

statement = f"\n{'='*60}\n"
statement += f"{self.account_name} 的交易流水\n"
statement += f"{'='*60}\n"
statement += f"{'日期':<20} {'类型':<10} {'金额':<15} {'余额':<15}\n"
statement += f"{'-'*60}\n"

for tx in self.transactions[-last_n:]:
amount_str = f"¥{tx['amount']:,.2f}"
balance_str = f"¥{tx['balance_after']:,.2f}"

# 根据交易类型设置金额显示颜色
if tx['type'] == '存款':
amount_display = f"\033[92m+{amount_str}\033[0m" # 绿色
else:
amount_display = f"\033[91m-{amount_str}\033[0m" # 红色

statement += f"{tx['date']:<20} {tx['description']:<10} {amount_display:<20} {balance_str:<15}\n"

statement += f"{'='*60}\n"
statement += f"当前总余额: \033[94m¥{self.balance:,.2f}\033[0m\n"
statement += f"{'='*60}"

return statement

def to_dict(self):
"""将账户数据转换为字典"""
return {
"account_number": self.account_number,
"account_name": self.account_name,
"balance": self.balance,
"password_hash": self.password_hash,
"transactions": self.transactions,
"creation_date": self.creation_date
}

@classmethod
def from_dict(cls, data):
"""从字典创建账户对象"""
account = cls(
data["account_number"],
data["account_name"],
data["balance"]
)
account.password_hash = data.get("password_hash")
account.transactions = data.get("transactions", [])
account.creation_date = data.get("creation_date", datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
return account
```

3.2 银行系统类

接下来,我们创建BankSystem类来管理所有账户:

```python
class BankSystem:
"""银行系统类"""

def __init__(self, data_file="accounts.json"):
self.data_file = data_file
self.accounts = {}
self.current_account = None
self.load_accounts()

def load_accounts(self):
"""加载账户数据"""
if os.path.exists(self.data_file):
try:
with open(self.data_file, 'r', encoding='utf-8') as f:
data = json.load(f)
for acc_data in data.values():
account = BankAccount.from_dict(acc_data)
self.accounts[account.account_number] = account
print(f"\033[92m✓ 已加载 {len(self.accounts)} 个账户\033[0m")
except Exception as e:
print(f"\033[91m✗ 加载账户数据失败: {e}\033[0m")
self.accounts = {}
else:
self.accounts = {}

def save_accounts(self):
"""保存账户数据"""
try:
data = {num: acc.to_dict() for num, acc in self.accounts.items()}
with open(self.data_file, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
return True
except Exception as e:
print(f"\033[91m✗ 保存账户数据失败: {e}\033[0m")
return False

def create_account(self):
"""创建新账户"""
print("\n" + "="*60)
print("创建新账户".center(60))
print("="*60)

# 生成账户号码
account_number = str(1000000000 + len(self.accounts) + 1)

# 获取账户信息
account_name = input("请输入账户持有人姓名: ").strip()
if not account_name:
print("\033[91m✗ 账户名不能为空\033[0m")
return None

# 设置密码
while True:
password = getpass("请设置账户密码 (输入为空则不设密码): ").strip()
if not password:
password = None
break
confirm = getpass("请确认密码: ").strip()
if password == confirm:
break
else:
print("\033[91m✗ 两次输入的密码不一致,请重新设置\033[0m")

# 初始存款
while True:
try:
initial_deposit = input("请输入初始存款金额 (默认0): ").strip()
if not initial_deposit:
initial_deposit = 0.0
else:
initial_deposit = float(initial_deposit)
if initial_deposit < 0:
print("\033[91m✗ 存款金额不能为负数\033[0m")
continue
break
except ValueError:
print("\033[91m✗ 请输入有效的数字\033[0m")

# 创建账户
account = BankAccount(account_number, account_name, initial_deposit, password)
self.accounts[account_number] = account
self.save_accounts()

print("\n\033[92m" + "="*60 + "\033[0m")
print(f"\033[92m✓ 账户创建成功!\033[0m")
print(f"\033[92m 账户号码: {account_number}\033[0m")
print(f"\033[92m 账户姓名: {account_name}\033[0m")
print(f"\033[92m 初始余额: ¥{initial_deposit:,.2f}\033[0m")
print(f"\033[92m 创建时间: {account.creation_date}\033[0m")
print("\033[92m" + "="*60 + "\033[0m")

return account

def login(self):
"""登录账户"""
print("\n" + "="*60)
print("账户登录".center(60))
print("="*60)

account_number = input("请输入账户号码: ").strip()
if account_number not in self.accounts:
print("\033[91m✗ 账户不存在\033[0m")
return False

account = self.accounts[account_number]

# 如果账户有密码,需要验证
if account.password_hash:
for i in range(3): # 最多尝试3次
password = getpass("请输入账户密码: ")
if account.verify_password(password):
break
else:
attempts_left = 2 - i
if attempts_left > 0:
print(f"\033[91m✗ 密码错误,还剩{attempts_left}次尝试机会\033[0m")
else:
print("\033[91m✗ 密码错误次数过多,登录失败\033[0m")
return False
else:
print("⚠ 此账户未设置密码,直接登录")

self.current_account = account
print(f"\n\033[92m✓ 登录成功!欢迎 {account.account_name}\033[0m")
return True

def logout(self):
"""登出账户"""
if self.current_account:
print(f"\n\033[92m✓ 再见,{self.current_account.account_name}!\033[0m")
self.current_account = None
return True

def show_menu(self):
"""显示主菜单"""
if not self.current_account:
return

while True:
print("\n" + "="*60)
print(f"欢迎,{self.current_account.account_name}".center(60))
print(f"账户: {self.current_account.account_number}".center(60))
print("="*60)
print(f"当前余额: \033[94m¥{self.current_account.balance:,.2f}\033[0m".center(60))
print("="*60)
print("1. 存款")
print("2. 取款")
print("3. 查看交易流水")
print("4. 修改密码")
print("5. 显示账户信息")
print("6. 退出登录")
print("0. 退出系统")
print("="*60)

choice = input("请选择操作 (0-6): ").strip()

if choice == "1":
self.deposit()
elif choice == "2":
self.withdraw()
elif choice == "3":
self.view_statement()
elif choice == "4":
self.change_password()
elif choice == "5":
self.show_account_info()
elif choice == "6":
self.logout()
break
elif choice == "0":
print("\n\033[92m感谢使用银行卡余额模拟器!再见!\033[0m")
sys.exit(0)
else:
print("\033[91m✗ 无效的选择,请重新输入\033[0m")

def deposit(self):
"""存款操作"""
try:
amount = float(input("请输入存款金额: "))
success, message = self.current_account.deposit(amount)
if success:
print(f"\n\033[92m{message}\033[0m")
self.save_accounts()
else:
print(f"\n\033[91m{message}\033[0m")
except ValueError:
print("\033[91m✗ 请输入有效的数字\033[0m")

def withdraw(self):
"""取款操作"""
try:
amount = float(input("请输入取款金额: "))
success, message = self.current_account.withdraw(amount)
if success:
print(f"\n\033[92m{message}\033[0m")
self.save_accounts()
else:
print(f"\n\033[91m{message}\033[0m")
except ValueError:
print("\033[91m✗ 请输入有效的数字\033[0m")

def view_statement(self):
"""查看交易流水"""
print(self.current_account.get_statement())

def change_password(self):
"""修改密码"""
if not self.current_account.password_hash:
print("⚠ 当前账户未设置密码")

# 验证原密码
if self.current_account.password_hash:
current_password = getpass("请输入当前密码: ")
if not self.current_account.verify_password(current_password):
print("\033[91m✗ 当前密码错误\033[0m")
return

# 设置新密码
while True:
new_password = getpass("请输入新密码 (输入为空则取消密码): ").strip()
if not new_password:
self.current_account.password_hash = None
print("\033[92m✓ 已移除账户密码\033[0m")
break

confirm = getpass("请确认新密码: ").strip()
if new_password == confirm:
self.current_account.password_hash = self.current_account._hash_password(new_password)
print("\033[92m✓ 密码修改成功\033[0m")
break
else:
print("\033[91m✗ 两次输入的密码不一致\033[0m")

self.save_accounts()

def show_account_info(self):
"""显示账户信息"""
acc = self.current_account
print("\n" + "="*60)
print("账户信息".center(60))
print("="*60)
print(f"账户号码: {acc.account_number}")
print(f"账户姓名: {acc.account_name}")
print(f"当前余额: ¥{acc.balance:,.2f}")
print(f"创建时间: {acc.creation_date}")
print(f"交易记录数: {len(acc.transactions)}")
print(f"密码保护: {'是' if acc.password_hash else '否'}")
print("="*60)

def run(self):
"""运行银行系统"""
print("\n" + "="*60)
print("银行卡余额模拟器".center(60))
print("仅供娱乐和学习使用".center(60))
print("="*60)

while True:
print("\n" + "="*60)
print("主菜单".center(60))
print("="*60)
print("1. 创建新账户")
print("2. 登录现有账户")
print("3. 退出系统")
print("="*60)

choice = input("请选择操作 (1-3): ").strip()

if choice == "1":
self.create_account()
elif choice == "2":
if self.login():
self.show_menu()
elif choice == "3":
print("\n\033[92m感谢使用银行卡余额模拟器!再见!\033[0m")
break
else:
print("\033[91m✗ 无效的选择,请重新输入\033[0m")
```

3.3 主程序

最后,我们添加主程序入口:

```python
def main():
"""主函数"""
# 检查Python版本
import sys
if sys.version_info < (3, 6):
print("\033[91m✗ 需要Python 3.6或更高版本\033[0m")
return

# 创建银行系统并运行
bank = BankSystem()
bank.run()

if __name__ == "__main__":
main()
```

四、使用说明

4.1 安装和运行

1. 确保已安装Python 3.6或更高版本
2. 将上述代码保存为bank_system.py
3. 在终端中运行:python bank_system.py

4.2 基本操作

1. 创建账户:选择主菜单的"创建新账户",按照提示输入信息
2. 登录账户:使用账户号码和密码登录
3. 存款/取款:登录后选择相应功能
4. 查看交易流水:查看最近的交易记录
5. 修改密码:增强账户安全性

五、功能扩展建议

这个基础版本可以进一步扩展:

1. 增加转账功能:实现账户间的资金转移
2. 添加利息计算:模拟银行存款利息
3. 图形界面:使用Tkinter或PyQt创建GUI
4. 网络功能:实现简单的客户端-服务器架构
5. 数据加密:使用更安全的加密算法保护数据
6. 报表导出:将交易记录导出为Excel或PDF

六、安全提醒

⚠️ 重要提醒:

1. 本项目仅供编程学习和娱乐使用
2. 所有数据存储在本地,没有真正的金融功能
3. 请勿使用真实银行账户信息
4. 请勿用于任何欺诈或非法用途
5. 密码使用SHA-256哈希存储,但生产环境需要更安全的方案

七、总结

通过这个项目,我们学习了:

· Python面向对象编程的实际应用
· 文件操作和JSON数据存储
· 基础密码学概念(哈希函数)
· 终端界面的美化技巧
· 金融系统的基本逻辑

编程不仅是工作技能,也可以是创造乐趣的工具。希望这个"银行卡余额模拟器"能带给你编程的快乐,同时加深对Python的理解!

---

免责声明:本项目为模拟程序,仅供学习和娱乐使用。所有功能均为模拟,不涉及真实金融交易。请遵守法律法规,不要用于任何非法用途。

完整代码获取:关注博主,后台回复"银行模拟器"获取完整代码和更新版本!

下期预告:如何为这个模拟器添加图形界面?敬请期待!

---

版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/7 8:25:42

Z-Image-Turbo新闻配图案例:媒体内容快速生成部署教程

Z-Image-Turbo新闻配图案例&#xff1a;媒体内容快速生成部署教程 1. 为什么新闻团队需要Z-Image-Turbo&#xff1f; 你有没有遇到过这样的场景&#xff1a;凌晨三点&#xff0c;突发社会事件需要配图&#xff0c;编辑在群里反复催“图呢&#xff1f;”&#xff0c;而美工还在…

作者头像 李华
网站建设 2026/4/6 14:51:50

Patreon资源高效管理与批量获取指南

Patreon资源高效管理与批量获取指南 【免费下载链接】PatreonDownloader Powerful tool for downloading content posted by creators on patreon.com. Supports content hosted on patreon itself as well as external sites (additional plugins might be required). 项目地…

作者头像 李华
网站建设 2026/4/16 15:48:04

Zotero PDF Translate:多引擎翻译解决方案全指南

Zotero PDF Translate&#xff1a;多引擎翻译解决方案全指南 【免费下载链接】zotero-pdf-translate 支持将PDF、EPub、网页内容、元数据、注释和笔记翻译为目标语言&#xff0c;并且兼容20多种翻译服务。 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-pdf-translate…

作者头像 李华
网站建设 2026/4/14 4:52:28

闲置RK3399设备如何重生?打造全能边缘计算节点实战

闲置RK3399设备如何重生&#xff1f;打造全能边缘计算节点实战 【免费下载链接】amlogic-s9xxx-armbian amlogic-s9xxx-armbian: 该项目提供了为Amlogic、Rockchip和Allwinner盒子构建的Armbian系统镜像&#xff0c;支持多种设备&#xff0c;允许用户将安卓TV系统更换为功能强大…

作者头像 李华
网站建设 2026/4/16 12:10:42

探索智能学术翻译:重构跨语言研究工具的文献处理效率

探索智能学术翻译&#xff1a;重构跨语言研究工具的文献处理效率 【免费下载链接】zotero-pdf-translate 支持将PDF、EPub、网页内容、元数据、注释和笔记翻译为目标语言&#xff0c;并且兼容20多种翻译服务。 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-pdf-trans…

作者头像 李华
网站建设 2026/4/8 17:27:23

3分钟解锁暗黑2单机新玩法:PlugY插件全功能入门指南

3分钟解锁暗黑2单机新玩法&#xff1a;PlugY插件全功能入门指南 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 还在为暗黑破坏神2单机模式的种种限制感到束手束脚吗…

作者头像 李华