国际惯例:实践是检验真理的唯一标准。
众所周知,在编程过程中理论知识再充实也需要通过项目的炼金石。下面给大家看一下我徒弟做的一个小项目实战要求,是做一个银行系统,就是我们去银行办业务时候会有个自助的ATM机,现在大部分业务都是由他来解决的。首先自己想一想,用面向对象的思想该怎样实现这个系统呢?都有哪些对象?他们各自的功能都有什么?想到的越多越好,在实现的时候,碰到一个问题解决一个问题,过程当中问题很多,也不是很容易解决,不过也就是这样的过程才能学到新的东西。
一、准备工作
首先走进银行的大门,会有工作人员来询问需要办理什么业务,当然得实话实说了,不过这个和系统没什么关系(* ̄︶ ̄)。接下来,如果要办理的业务是比较大众化的,可以在机器上完成,那么她就会带着我们到一个庞大的小机器旁边。前面他还需要操作几下,来让机器可以为我们工作,有时可以见到招呼一个更高级的员工来输下指纹。这些我们可以理解为管理员来启动系统(有些人是不是觉得哪有这么麻烦,主要我这里说的是银行里面那几台功能比较全的,不单单是简单的自动取款机)。
接下来该办理我们的业务了,都有哪些业务呢?先列举一些:查余额,存款,取款,转账,改个密码,还可以挂失锁卡,对应还能解锁,把最基本的忘记了,没有办卡哪有这些操作呢,开户也得算上,补卡,销户等等。
到这里了,我们和实际情况相比没有实体的卡,所以会有一些差异。剩下的过程中想到了再说。
二、转换思想
前面大概确定了需要实现的功能,最终我们还是要写成代码,所以得从编程的思想来考虑那些需求。
首先要考虑这个系统中有哪些对象,从人到银行的ATM机都有哪些事物。人,银行卡,ATM机,这三个是必须有的了,还需要什么,开始办理业务时候那个帮我们操作的人有很多和我们用户不一样的操作,把他也当做一个对象。
人。人这个对象有哪些属性呢?人有自己的一些信息,还有银行卡,剩下要办理的业务我们人为的给定。
卡。卡也有本身的一些信息。
ATM。atm机的功能就要多一些了,首先就是上面整理出来的那些存取款等等的功能,他都得实现。除此之外还有个工作人员对他的操作,他也得处理一下。
工作人员。他们有启用和关闭这个系统的权利。
大体方向有了,剩下的就一点点的完善。
三、功能实现
先从简单的开始,前面说到,客户和卡的属性还是比较单纯的,那就先把他们解决了。
1 # 银行卡:卡号,卡的密码,余额
2 class Card(object):
3 def __init__(self, cardId, cardPasswd, cardMoney):
4 self.cardId = cardId
5 self.cardPasswd = cardPasswd
6 self.cardMony = cardMoney
1 # 客户:姓名,身份证号,手机号,银行卡(性别年龄那些只是多了个属性,操作时一样的,就不多写了)
2 class User(object):
3 def __init__(self, name, idCard, phone, card):
4 self.name = name
5 self.idCard = idCard
6 self.phone = phone
7 self.card = card
以上两个类是对银行卡的客户的一个初始化,里面都是列写了一下必要的属性,比如补卡得用身份证,这里通过身份证号代替,等等。其中人的属性里的卡就是上面定义的卡,人的这一个卡属性就包括卡的内部几个属性。
接下来写一下管理员的功能:
1 import time
2
3 class Admin(object):
4 # 为管理员设置个账号密码,为了不随便让人能操作一些危险的内容。
5 admin = "1"
6 passwd = "1"
7
8 # 我们把初始的界面就放在管理员的类里了,他是第一个操作这个机器的嘛
9 def printAdminView(self):
10 print("****************************************************")
11 print("* *")
12 print("* *")
13 print("* 欢迎登陆银行 *")
14 print("* *")
15 print("* *")
16 print("****************************************************")
17
18 def printSysFunctionView(self):
19 print("****************************************************")
20 print("* 开户(1) 查询(2) *")
21 print("* 取款(3) 存款(4) *")
22 print("* 转账(5) 改密(6) *")
23 print("* 锁定(7) 解锁(8) *")
24 print("* 补卡(9) 销户(0) *")
25 print("* 退出(q) *")
26 print("****************************************************")
27
28 # 这里就是开始时候得验证一下是不是管理员,然后再决定是不是给他这些权利
29 def adminOption(self):
30 inputAdmin = input("请输入管理员账号:")
31 if self.admin != inputAdmin:
32 print("输入账号有误!")
33 return -1
34 inputPasswd = input("请输入管理员密码:")
35 if self.passwd != inputPasswd:
36 print("密码输入有误!")
37 return -1
38
39 # 能执行到这里说明账号密码正确
40 print("操作成功,请稍后······")
41 time.sleep(2)
42 return 0
上面的代码中有个time.sleep(),这个是为了让系统更生动一些,设置的延迟,来模拟系统在大量数据时操作的时延。
前面几个是比较好理解的,现在开始实现我们的系统的功能。这些就放在ATM机的模块里了,有需求就再修改添加策略。
按照上面的那个目录的顺序来,第一个要实现的功能就是开户。开户就得创建出那一系列的属性。并且这些信息我们还需要存储起来,要不然下次再来的时候就发现自己办的卡已经无效了。这些信息可以使用一个键值对来存储,那么key用哪个属性呢。考虑一下,姓名:可能有重名的,身份证号:这个人也许会办不止一张卡,最