Python3---对象编程思想
前言
该文章讲解了对象编程的思想理念。
2020-03-10
天象独行
首先,面向对象编程理念和面对过程编程是不同的,我们先 说说面向过程,侧重于程序执行的过程,也就是事情的本身。然而面对对象侧重于“对象”。这么说可能不太理解。举个例子:我们想要吃煎饼。那么用面向过程的思想来解决这个问题该怎么做呢?我们会思考,首先确定去哪里买,多少钱,怎么去等等对不对。那这就是对事情本身的处理思考。那么利用面向对象的思想是怎么处理的呢?嗯,想吃煎饼了,打电话看看有没有外卖。看!!!我没有去思考如何去吃到煎饼,而是找到了外卖平台。也可以理解为“对象”。找到一个能处理这件事的“对象”来处理就可以了。好了,那么对于两者之间的区别想必大家有了一个基本的概念。现在我们来通过下面的例子来更好的体会“面向对象”编程思想。
下面我希望去编写一个银行取款系统。(注释:异常的简单,请各位不要介意,主要是体会面向对象的思想)。首先,我们想想,取款系统我们需要哪些对象呢?嗯,“人”,“银行卡”,“取款机”。目前我们想到的有这些对象是吗?(万物皆对象)我们都知道“对象”有三个特性:类名,属性,行为。是吗?好,那我们下面分析一下:
人:
#我们定义一下,“人”这个对象的类名,称为“Person”这里没有什么好说的。一个名字而已。
#我们看看,“人”这个对象该有什么属性呢?仔细想想。性格,性别这些都是对不对?那么对于取款系统我们需要的属性是什么呢?我们下面看看,姓名,身份证,电话号码对不对?
#行为呢?人可以取款,存钱等操作对不对。
卡:
#类名,就不说了。行为也没有什么,属性的话?银行卡有什么?卡号,密码,余额对不对?
提款机:
#类名,属性就不说了,对于我们存取Money没有什么。总不能说取款机的颜色影响取款的速度吧!!!那行为呢?提款机可以干什么?开户,查询,取款等对不对。那是不是“人”这个对象是不是也有这些行为。我们在仔细想想,“人”这个对象的行为是不是依靠提款机来完成的。那我们是不是可以设定这些行为在提款机里面就可以了对不对?
好的,那按照上面的思考我们稍微整理了一下:
''' 对象: 人: 类名:Person 属性:姓名,身份证号,电话号码 行为: 卡: 类名:Card 属性:卡号,密码,余额 提款机: 类名:ATM 属性: 行为:开户,查询,取款,存储,转账,改密,锁定,解锁,补卡,销户,退出,界面 银行: 类名:bank 属性:用户列表 提款机 '''
好,既然我们心里有了一个大概。那现在我们开始写程序。我们先写一个套路的格式,一个主程序。(对于这里有什么不理解的可以自行百度。讲解的文章很多)
def main(): pass if __name__ == "__main__": main()
那现在我们来思考,我们日常见到的提款机是什么样子的。日常取款看到的东西,首先我们应该是提供一个界面是不是?好。那我们首先新建一个py文件。内容呢,相当于定义一个“ATM”的类。方便我们实例化使用。那么我们先把提款机提供界面的这个行为来写出来:
class View(object): #初始界面 def printAdminView(self): print("******************************************************************************") print("* *") print("* *") print("* 欢迎登陆独行银行 *") print("* *") print("* *") print("* *") print("******************************************************************************") #功能界面 def printFunctionView(self): print("******************************************************************************") print("* 开户(1) 查询(2) *") print("* 取款(3) 存款(4) *") print("* 转账(5) 改密(6) *") print("* 锁定(7) 解锁(8) *") print("* 补卡(9) 销户(0) *") print("* 退出(t) *") print("******************************************************************************")
看起来,已经写好了。那么我们回到主界面,这个时候我们想想面对对象编程的思想?想做什么事情就找那个对象是不是!!!好的那么我们来实例化一下ATM的对象。
import ATM
def main():
#界面显示:
view = ATM.View()
view.printAdminView()
if __name__ == "__main__":
main()
#运行结果:
D:\Python\venv\Scripts\python.exe D:/Python/银行自动提款机系统.py ****************************************************************************** * * * * * 欢迎登陆小涛银行 * * * * * * * ****************************************************************************** Process finished with exit code 0
尝试运行一下,看!!!对象”view“成功的帮助了我们展现了一个定义好的界面对不对。看起来面向对象这个思路真是不错。现在我们在想想,我们正式进入取钱等操作的时候是不是需要输入一个账号密码?那是不是我们需要输入并且验证账号密码呢?那该谁来帮我们完成这个行为呢?我们也给ATM好不好?(正常需要对数据库进行查询确定,这里主要讲解面对对象编程的思想。就不去折腾了)好,既然决定把这个重要的任务交给ATM了。那么我们编写一下ATM的这个文件。如下:
#设定ATM功能 class FunctionAtm(object): #基本属性 admin = "admin" passwd = "admin" #提款机对象 def __init__(self): self.allUsers = {} #验证管理员账号密码 def VerificationAdmin(self): inputadmin = input("请输入管理员账号:") # 验证账号密码 if self.admin != inputadmin: print("账号输入有误!!") return -1 inputPassword = input("请输入管理员密码:") if self.passwd != inputPassword: print("密码输入有误!!") return -1 # 账号密码正确 print("操作成功! 请稍后......") time.sleep(2) return 0
好的,输入管理员账号密码以及验证的任务已经交给ATM了。那么现在我们在主程序里面去用”让“这个ATM来帮忙做个输入账号密码验证的行为对不对。那我们来看看下面的代码:
import ATM import time def main(): #界面显示: view = ATM.View() # 功能实例化 function = ATM.FunctionAtm() # 用户管理员开机 view.printAdminView() if function.VerificationAdmin(): return -1 if __name__ == "__main__": main()
我们来运行看看,看!!!已经有了,可以验证的功能了对不对。知道这里。我想各位应该有了一定的体悟。总结来说。给指定的对象添加需要的属性,行为。需要用到什么在主程序”叫一声“就可以了对不对。
D:\Python\venv\Scripts\python.exe D:/Python/银行自动提款机系统.py ****************************************************************************** * * * * * 欢迎登陆小涛银行 * * * * * * * ****************************************************************************** 请输入管理员账号:admin 请输入管理员密码:admin 操作成功! 请稍后...... Process finished with exit code 0
好的,那现在我们想想,当我们输入正确的,我们的系统是需要一直等待冲突的状态对不对。那么我们是不是需要一个死循环呢?对不对。这里我们通过一个While 死循环+if 语句来确定功能的选择。这里我们看看这个架构,那么我们需要什么样的功能,在对应的if语句分支下去”叫“对应的对象去做对应的操作对不对。
import ATM import time def main(): #界面显示: view = ATM.View() # 功能实例化 function = ATM.FunctionAtm() # 用户管理员开机 view.printAdminView() if function.VerificationAdmin(): return -1 # 功能实例化 function = ATM.FunctionAtm() # 用户管理员开机 view.printAdminView() if function.VerificationAdmin(): return -1 # 功能模块 while True: view.printFunctionView() # 等待用户操作 option = input("请输入您的操作:") if option == "1": # 开户 function.CreateUser() elif option == "2": # 查询 pass elif option == "3": # 取款 pass elif option == "4": # 存储 pass elif option == "5": # 转账 pass elif option == "6": # 改密 pass elif option == "7": # 锁定 pass elif option == "8": # 解锁 pass elif option == "9": # 补卡 pass elif option == "0": # 销户 pass elif option == "t": # 退出 if not function.VerificationAdmin(): return -1 time.sleep(2) if __name__ == "__main__": main()
接下来我们来看看第一个功能”开户“。这个行为我们是ATM的对象对不对。那现在我们在ATM当中添加这个”行为“
#开户 def CreateUser(self): name = input("请输入您的姓名:") IDCard = input("请输入您的身份证号码:") phone = input("请输入您的电话号码:") prestoreMoney = int(input("请输入预存款金额:")) if prestoreMoney < 0: print("预存款输入有误,开户失败") return -1 onePasswd = input("请输入密码:") if not self.CheckPasswd(onePasswd): print("密码输入错误!!开户失败") #信息收集完成 cardID = self.randomCardID() #生成卡号 card = Card(cardID,onePasswd,prestoreMoney) user = User(name,IDCard,phone,card) self.allUsers[cardID] = user #保存信息 print("开户成功,请牢记卡号:",cardID) #目标:向用户字典中添加一对键值对(卡号---用户) #查询
在这个”开户“功能的设定当中,我们发现它功能需要的信息包含了对象”人“和”卡“这个两个对象属性对不对。那这个时候我们需要对象”人“以及”卡“。下面我们来建立这两个类并且写出需要的属性:
class User(object): def __init__(self,name,idCard,phone,card): self.name = name self.idCard = idCard self.phone = phone self.card = card
class Card(object): def __init__(self,cardID,cardPasswd,cardMoney): self.cardID = cardID self.cardPasswd = cardPasswd self.cardMoney = cardMoney
那现在我们在仔细看看”开户“行为的代码?我们发现还有生成随机卡号,验证账号密码等。那这个时候,对于这些可以重复性的使用的行为我们新建一个函数是不是就可以了。好。我们来看看这些功能代码:
#验证密码: def CheckPasswd(self,realPasswd): for i in range(3): tempPasswd = input("请输入密码:") if tempPasswd == realPasswd: return True return False #生成卡号: def randomCardID(self): str = "" for i in range(6): ch = chr(random.randrange(ord("0"),ord("9") + 1)) str += ch #判断是否重复,对比数据库是否存在 if not self.allUsers.get(str): return str
知道目前为止,”开户“这个行为ATM已经具备了。那么下面我们让主程序调用这个行为是不是就可以了呢?下面我们来看看主程序:
import ATM import time def main(): #界面显示: view = ATM.View() # 功能实例化 function = ATM.FunctionAtm() # 用户管理员开机 view.printAdminView() if function.VerificationAdmin(): return -1 # 功能模块 while True: view.printFunctionView() # 等待用户操作 option = input("请输入您的操作:") if option == "1": # 开户 function.CreateUser() elif option == "2": # 查询 pass elif option == "3": # 取款 pass elif option == "4": # 存储 pass elif option == "5": # 转账 pass elif option == "6": # 改密 pass elif option == "7": # 锁定 pass elif option == "8": # 解锁 pass elif option == "9": # 补卡 pass elif option == "0": # 销户 pass elif option == "t": # 退出 if not function.VerificationAdmin(): return -1 time.sleep(2) if __name__ == "__main__": main()
运行代码:
D:\Python\venv\Scripts\python.exe D:/Python/银行自动提款机系统.py ****************************************************************************** * * * * * 欢迎登陆独行银行 * * * * * * * ****************************************************************************** 请输入管理员账号:admin 请输入管理员密码:admin 操作成功! 请稍后...... ****************************************************************************** * 开户(1) 查询(2) * * 取款(3) 存款(4) * * 转账(5) 改密(6) * * 锁定(7) 解锁(8) * * 补卡(9) 销户(0) * * 退出(t) * ****************************************************************************** 请输入您的操作:1 请输入您的姓名:sdfas 请输入您的身份证号码:asdf 请输入您的电话号码:safd 请输入预存款金额:100 请输入密码:admin 请输入密码:admin 开户成功,请牢记卡号: 907500 ****************************************************************************** * 开户(1) 查询(2) * * 取款(3) 存款(4) * * 转账(5) 改密(6) * * 锁定(7) 解锁(8) * * 补卡(9) 销户(0) * * 退出(t) * ****************************************************************************** 请输入您的操作: