【二十五】Python全栈之路--反射_ATM项目

2024-01-22 12:59

本文主要是介绍【二十五】Python全栈之路--反射_ATM项目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1. property_反射
      • 1.1 property装饰器
      • 1.2 反射
    • 2. ATM需求分许
    • 3. 项目基本版

1. property_反射

1.1 property装饰器

# ### property 
"""
可以把方法变成属性 : 可以动态的控制属性的获取,设置,删除相关操作
@property  获取属性
@方法名.setter  设置属性
@方法名.deleter 删除属性
"""# 方法一
"""是同一个方法名"""
class MyClass():def __init__(self,name):self.name = name@propertydef username(self):return self.name# pass@username.setterdef username(self,val):# print(val)self.name = valpass@username.deleterdef username(self):# print("222")del self.namepassobj = MyClass("小红")
# 获取值的时候自动触发@property 装饰器下的方法
res = obj.username
print(res)# 设置值的时候自动触发@username.setter 装饰器下的方法
obj.username = "小兰"
print(obj.username)# 删除值的时候自动触发@username.deleter 装饰器下的方法
# del obj.username
# print(obj.username)# 方法二
class MyClass():def __init__(self,name):self.name = name# 获取数据def get_username(self):return self.name# 设置数据def set_username(self,val):self.name = val# 删除数据def del_username(self):del self.name# 参数的顺序: 获取 , 设置  , 删除username = property(get_username , set_username  , del_username )obj = MyClass("小芳")
# 获取值的时候,执行get_username下的相关操作
print(obj.username)# 设置值的时候,执行 set_username 下的相关操作
obj.username = "11223344"
print(obj.username)# 删除值的时候,执行 del_username 下的相关操作
del obj.username
print(obj.username)

1.2 反射

# ### 反射
""" 通过字符串操作类对象 或者 模块中的相关成员的操作 """
"""
#hasattr() 检测对象/类是否有指定的成员
#getattr() 获取对象/类成员的值
#setattr() 设置对象/类成员的值
#delattr() 删除对象/类成员的值 
"""# ### part1 通过字符串反射类对象中的成员
class Father():passclass Mother():passclass Children(Father,Mother):eye = "蓝色的"weight = "1吨"def eat(self):print("小孩下生会喝奶")def drink(self):print("小孩下生喜欢喝勇闯天涯...")def __la(self):print("小孩自动啦,无法控制")obj = Children()# (1)hasattr() 检测对象/类是否有指定的成员
# 对象
res = hasattr(obj,"eye")
print(res)# 类
res = hasattr(Children,"eat123")
print(res)# (2)getattr() 获取对象/类成员的值
# 对象
res = getattr(obj,"weight")
print(res)
# 如果获取的值不存在,可以设置第三个参数,防止报错
res = getattr(obj,"weight123","抱歉这个值不存在")
print(res)# 类
# 通过类进行反射 (反射出来的是普通方法)
func = getattr(Children,"drink")
print(func)
func(1)
# 通过对象进行反射 (反射出来的是绑定方法)
func = getattr(obj,"drink")
print(func)
func()# 综合案例
strvar = "eat11"
if hasattr(obj,strvar):func = getattr(obj,strvar)func()
else:print("抱歉,该成员不存在")# (3) setattr() 设置对象/类成员的值
# 对象
setattr(obj,"skin","黑人")
print(obj.skin)
# 类
setattr(Children,"skin","土耳其人")
print(Children.skin)
print(obj.skin)# (4) delattr() 删除对象/类成员的值 
# 对象
# delattr(obj,"skin")
# print(obj.skin)# 类
# delattr(Children,"skin")
# print(Children.skin)# ### part2 通过字符串反射模块中的成员
"""
sys.modules 返回一个系统字典,字典的键是加载的所有模块
'__main__': <module '__main__' from '/mnt/hgfs/python32_gx/day25/2.py'>
字典中的__main__这个键对应的是该文件的模块对象;
"""def func1():print("我是func1方法")
def func2():print("我是func2方法")
def func3():print("我是func3方法")import sys
print(sys.modules) # 系统字典
module = sys.modules["__main__"]
print(module)
res = getattr(module,"func1")
print(res)# 综合案例 : (通过字符串反射模块中的成员)
while True:strvar = input("请输入你想要使用的功能:")if hasattr(module,strvar):func = getattr(module,strvar)func()elif strvar.upper() == "Q":print("再见")breakelse:print("没有该成员~!")

2. ATM需求分许

# ### 需求分析card 卡类
卡号    密码      余额    锁定状态
cardid  password   money   islockperson 用户类
姓名   身份证号  手机号   卡对象
name   userid     phone    cardview   视图类
登录 打印欢迎界面 打印操作界面operation 操作类
完成10个功能main 类,统一调用分模块的功能;
开户(1)   register 
查询(2)   query          
存钱(3)   save_money
取钱(4)   get_money
转账(5)   trans_money
改密(6)   change_pwd
锁卡(7)   lock
解卡(8)   unlock       
补卡(9)   new_card
退出(0)   save请输入管理员的账户:admin
请输入管理员密码111
*******************************************
*                                         *
*                                         *
*         Welcome To beijing Bank          *
*                                         *
*                                         *
*******************************************
*******************************************
*           开户(1)    查询(2)             *
*           存钱(3)    取钱(4)             *
*           转账(5)    改密(6)             *
*           锁卡(7)    解卡(8)             *
*           补卡(9)    退出(0)             *
*******************************************
请选择需要办理的业务用户和卡以什么形式存储在文件中 pickle
user.txt   => {卡号:用户对象} {"555666": 用户对象}    =>  user_dict
userid.txt => {身份证:卡号}   {"111": "555666" , "222":"777888"} => user_id_dict

模块提示:

# 基本实现
取钱:卡是否存在,是否冻结,取钱金额是否正确
转账:把一个卡里的钱转到其他卡内 (卡是否存在,是否冻结,对方账户是否存在,转账的金额是否正确)
改密:(1)原密码改密  (2)身份证改密
解卡:判断卡是否存在,使用身份证解卡
锁卡:1:使用密码冻结  2:使用身份证号冻结
补卡:将旧用户的所有信息和新卡绑定(包括名字,余额等所有卡信息和用户信息,数据重新绑定)[user_id_dict]
通过身份证 => 卡号  => 用户对象 # 类型要判断姓名不能为空,为中文或者字母密码长度6位不能空,字母数字下划线 \w (纯数字的密码不允许的)身份证号长度18位不能为空,正则匹配,一个身份证号只能注册一次不能重复.不能给自己转账

3. 项目基本版

在项目中有一个main.py(单入口模式)、还有要给package目录(里面放入的是个各种功能模块,事例中有save保存、用户注册、查询功能)
在这里插入图片描述

main.py文件:

# ### main 入口文件
from package.view import View
from package.operation import Operationclass Main():@staticmethoddef run():if View.login():obj = Operation()while True:				 choice = input("请选择需要办理的业务:")if choice == "1":obj.register()elif choice == "2":obj.query()elif choice == "3":passelif choice == "4":passelif choice == "5":passelif choice == "6":passelif choice == "7":passelif choice == "8":passelif choice == "9":passelif choice == "0":obj.save()breakif __name__ == "__main__":Main.run()

package目录下有card.pyoperation.pyperson.pyview.py文件,这是ATM项目的部分功能

card.py文件:

# ### card 类
class Card():def __init__(self,cardid,password,money):self.cardid = cardidself.password = passwordself.money = money# 默认卡是不锁定的 Falseself.islock = False

operation.py文件:

# ### 操作类 operation
import os
import pickle
import random
from .card import Card
from .person import Personclass Operation():def __init__(self):# 加载user.txt文件数据self.load_user()# 加载userid.txt文件数据self.load_userid()# 加载user.txt文件数据def load_user(self):if os.path.exists("user.txt"):with open("user.txt",mode="rb") as fp:self.user_dict = pickle.load(fp)else:# 设置空字典self.user_dict = {}print(self.user_dict)# 加载userid.txt文件数据def load_userid(self):if os.path.exists("userid.txt"):with open("userid.txt",mode="rb") as fp:self.user_id_dict = pickle.load(fp)else:# 设置空字典self.user_id_dict = {}print(self.user_id_dict)			# 保存退出def save(self):	# 存储user_dict 字典with open("user.txt",mode="wb") as fp:pickle.dump(self.user_dict,fp)# 存储user_id_dict 字典with open("userid.txt",mode="wb") as fp:pickle.dump(self.user_id_dict,fp)# 注册用户	def register(self):# 获取用户名name = input("请输入您的姓名:")# 获取身份证号userid = input("请输入您的身份证号:")# 获取手机号phone = input("请输入您的手机号:")# 获取密码password = self.get_pwd("请输入您的密码:","请确认您的密码:")# 获取卡号cardid = self.get_cardid()# 卡内默认余额 10元money = 10# 创建一张卡card = Card(cardid,password,money)# 创建一个用户user = Person(name,userid,phone,card)# 存储数据到 user_dict    卡号:用户对象self.user_dict[cardid] = user# 存储数据到 user_id_dict 身份证号:卡号self.user_id_dict[userid] = cardidprint("恭喜{}开卡成功,您的卡号为:{},卡内余额{}元".format(name,cardid,money))# 获取密码def get_pwd(self,name1,name2):while True:pwd1 = input(name1)pwd2 = input(name2)if pwd1 == pwd2:return pwd1else:print("两次密码不一致,请重新输入")# 获取卡号def get_cardid(self):while True:cardid = str(random.randrange(100000,1000000))if cardid not in self.user_dict:return cardiddef query(self):# 1.获取这张卡的相关信息card = self.get_card_info()if not card:print("抱歉,您的这张卡不存在")else:if card.islock:print("抱歉,您的卡已经被锁了")else:if self.check_pwd(card):# 显示卡内余额print("您的卡内余额是{}元".format(card.money))# 用的信息def get_card_info(self):cardid = input("请输入您的卡号:")if cardid not in self.user_dict:return Falseelse:# 通过卡号 -> 用户对象user = self.user_dict[cardid]return user.carddef check_pwd(self,card):times = 1while times <= 3:pwd = input("请输入您的密码")if pwd == card.password:return Trueelse:#剩余次数 = 总次数 - 使用次数print("密码错误~ , 您还剩下{}次机会".format(3 - times))if times == 3:card.islock = Trueprint("抱歉,密码输错三次,卡被锁定,请联系管理员.")times+=1

person.py文件:

# ### 用户类class Person():def __init__(self,name,userid,phone,card):self.name = nameself.userid = useridself.phone = phone# card属性中存放的是 卡对象 ;self.card = card

view.py文件:

# ### 视图类
import time
# 登录 打印欢迎界面 打印操作界面
class View():def login():name = input("请输入管理员的账户:")pwd = input("请输入管理员密码:")if name == "admin" and pwd == "111":# 打印欢迎界面View.welcome_view()# 延迟一秒time.sleep(1)# 打印操作界面View.operation_view()return Trueelse:print("抱歉,您的用户密码有错误")@staticmethoddef welcome_view():print("*******************************************")print("*                                         *")print("*                                         *")print("*         Welcome To OldBoy Bank          *")print("*                                         *")print("*                                         *")print("*******************************************")@staticmethoddef operation_view():print("*******************************************")print("*           开户(1)    查询(2)             *")print("*           存钱(3)    取钱(4)             *")print("*           转账(5)    改密(6)             *")print("*           锁卡(7)    解卡(8)             *")print("*           补卡(9)    退出(0)             *")print("*******************************************")if __name__ == "__main__":View.login()

这篇关于【二十五】Python全栈之路--反射_ATM项目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/633052

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相