Python 类实战
还是以我们之前做过的,通讯录功能为例,这节课我们继续对通讯录功能使用类进行改造:
1. 通讯录功能简介
编写程序 addressBook.py 实现通讯录管理系统,通讯录包含若干联系人,每个联系人包括:姓名、地址、电话 3 项内容。程序提供 4 项基本功能:
- 增加联系人: 用户输入姓名、地址、电话等信息,将信息保存在一个列表中
- 列出联系人: 打印输出所有联系人的信息
- 查询联系人: 用户输入联系人姓名,打印输出该联系人的信息
- 删除联系人: 用户输入联系人姓名,从通讯录中删除该联系人
通过命令行界面实现以上功能,程序 addressBook.py 运行时首先打印一个菜单,如下所示:
C:\> python addressBook.py
1. create person
2. list all persons
3. query person
4. delete person
5. quit
Enter a number(1-5):
总共有 5 个选项,用户输入对应的数字选择相应的功能,如下表所示:
| 数字选项 | 功能描述 |
|---|---|
| 1. create person | 增加联系人 |
| 2. list all persons | 列出联系人 |
| 3. query person | 查询联系人 |
| 4. delete person | 删除联系人 |
| 5. quit | 退出通讯录程序 |
2. 程序框架
2.1 描述单个联系人的数据结构
程序使用字典描述一个联系人,假设某个联系人的信息如下:
| 姓名 | 地址 | 电话 |
|---|---|---|
| 张三 | 南京 | 12306 |
使用字典描述该联系人如下:
>>> person = {'name': '张三', 'address': '南京', 'phone': '12306'}
- 字典有三个键:name、address、phone
- 对应的值分别为:张三、南京、12306
2.2 描述所有联系人的数据结构
程序将所有联系人信息存储在列表中,即通讯录是一个列表、列表的元素是字典。假设通讯录中有两个人,它们的信息如下所示:
| 姓名 | 地址 | 电话 |
|---|---|---|
| 张三 | 南京 | 12306 |
| 李四 | 王五 | 10086 |
本节使用面向对象的上设计方法实现通讯录,使用一个类 AddressBook 描述通讯录,类 AddressBook 的核心成员是一个列表,该列表保存了所有联系人, 代码如下:
class AddressBook:
def __init__(self):
self.persons = []
def addPerson(person):
self.person.append(person)
addressBook = AddressBook()
zhangSan = {'name': '张三', 'address': '南京', 'phone': '12306'}
liSi = {'name': '李四', 'address': '北京', 'phone': '10086'}
addressBook.addPerson(zhangSan)
addressBook.addPerson(lisi)
- 在第 1 行,定义了类 AddressBook 描述通讯录
- 在第 3 行,定义了成员变量 persons,它是一个列表,记录了所有的联系人
- 在第 5 行,定义了成员方法 addPerson,它将单个联系人加入到联系人列表中
- 在第 8 行,使用类 AdressBook 创建一个对象
- 创建两个联系人
- 在第 9 行,变量 zhangSan 的类型是一个字典,描述了张三的信息
- 在第 10 行,变量 liSi 的类型是一个字典,描述了李四的信息
- 将联系人添加到通讯录中
- 在第 11 行,将联系人 zhangSan 添加到通讯录中
- 在第 12 行,将联系人 liSi 添加到通讯录中
2.3 类 AddressBook 的主要成员方法
分析通讯录的功能需求,初步将程序划分为 4 个功能模块,如下表所示:
| 功能模块 | 成员方法 |
|---|---|
| 增加联系人 | create_person |
| 列出联系人 | list_person |
| 查询联系人 | query_person |
| 删除联系人 | delete_person |
使用 4 个成员方法实现相应的功能,这里先写出成员方法的定义,暂时忽略实现,代码如下:
class AddressBook:
def __init__(self):
self.persons = []
def create_person(self):
pass
def list_person(self):
pass
def query_person(self):
pass
def delete_person(self):
pass
2.4 主控模块
本节完成程序的主功能模块 main,函数 main 的功能逻辑如下:
- 获取用户输入的选择
- 根据用户的选择执行对应的功能
- 重复执行第 1 步的操作
函数 main 的实现代码如下:
def get_choice():
pass
def main():
addressBook = AddressBook()
while True:
choice = get_choice()
if choice == '1':
addressBook.create_person()
elif choice == '2':
addressBook.list_person()
elif choice == '3':
addressBook.query_person()
elif choice == '4':
addressBook.delete_person()
elif choice == '5':
break
else:
print('Invalid choice')
main()
- 在第 1 行,定义了函数 get_choice,该函数打印功能菜单并读取用户的选择
- 在第 4 行,定义了函数 main,该函数读取用户选择,并执行相应功能
- 在第 5 行,使用类 AdressBook 创建一个对象 addressBook
- 在第 6 行,创建一个 while 死循环
- 在第 7 行,使用 get_choice() 函数获取用户输入的选择
- 在第 9 行至第 20 行,根据 choice 执行对象 addressBook 相应的成员方法
- 在第 18 行,如果 choice == ‘5’,则执行 break 退出程序
2.5 获取用户输入
编写函数 get_choice 获取用户的选择,代码如下:
def get_choice():
print('1. create person')
print('2. list all persons')
print('3. query person')
print('4. delete person')
print('5. quit')
choice = input('Enter a number(1-5):')
return choice
- 在第 2 行到第 6 行,打印功能菜单
- 在第 7 行,使用 input() 函数获取用户输入的选择
- 在第 8 行,返回用户的选择 choice
3. 增加联系人
本小节实现增加联系人的功能,如下所示:
def create_person(self):
name = input('name: ')
address = input('address: ')
phone = input('phone: ')
person = {'name': name, 'address': address, 'phone': phone}
self.persons.append(person)
- 在第 1 行,定义函数 create_person,该函数实现增加联系人的功能
- 在第 2 行,获取用户输入的 name
- 在第 3 行,获取用户输入的 address
- 在第 4 行,获取用户输入的 phone
- 在第 5 行,根据用户输入的 name、address、phone 创建一个字典,用于描述该联系人
- 在第 6 行,将联系人加入到 self.persons 中
4. 列出联系人
本小节实现列出所有联系人的功能,如下所示:
def list_person(self):
for person in self.persons:
print('%s,%s,%s' % (person['name'], person['address'], person['phone']))
- 在第 1 行,定义函数 list_person,实现列出所有联系人的功能
- 在第 2 行,遍历列表 self.persons,循环变量 self.persons 是一个字典
- 在第 3 行,打印变量 person 的内容
对每个联系人打印输出一行,假设通讯录中已经存储了张三和李四两个联系人,输出如下:
C:\> python addressBook.py
1. create person
2. list all persons
3. query person
4. delete person
5. quit
Enter a number(1-5): 2
张三,南京,12306
李四,北京,10086
- 在第 7 行,用户选择执行功能 2
- 在第 8 行,打印联系人张三的信息
- 在第 9 行,打印联系人李四的信息
5. 查询联系人
本小节实现查询联系人的功能,如下所示:
def query_person(self):
name = input('name: ')
for person in self.persons:
if person['name'] == name:
print('%s,%s,%s' % (person['name'], person['address'], person['phone']))
- 在第 1 行,定义函数 query_person,实现查询联系人的功能
- 在第 2 行,获取用户输入的 name
- 在第 3 行,遍历列表 self.persons,循环变量 self.persons 是一个字典
- 在第 4 行,如果用户输入的 name 和循环访问 person 的 name 相同,则表示找到指定的 person
- 在第 5 行,打印变量 person 的内容
6. 删除联系人
本小节实现删除联系人的功能,如下所示:
def delete_person(self):
name = input('name: ')
for person in self.persons:
if person['name'] == name:
self.persons.remove(person)
break
- 在第 1 行,定义函数 delete_person,实现删除联系人的功能
- 在第 2 行,获取用户输入的 name
- 在第 3 行,遍历列表 self.persons,循环变量 self.persons 是一个字典
- 在第 4 行,如果用户输入的 name 和循环访问 person 的 name 相同,则表示找到指定的 person
- 在第 5 行,使用方法 self.persons.remove(person),从 self.persons 中删除元素 person
- 在第 6 行,退出 for 循环
7. 完整的程序
实例演示
预览
复制
class AddressBook:
def __init__(self):
self.persons = []
def create_person(self):
name = input('name: ')
address = input('address: ')
phone = input('phone: ')
person = {'name': name, 'address': address, 'phone': phone}
self.persons.append(person)
def list_person(self):
for person in self.persons:
print('%s,%s,%s' % (person['name'], person['address'], person['phone']))
def query_person(self):
name = input('name: ')
for person in self.persons:
if person['name'] == name:
print('%s,%s,%s' % (person['name'], person['address'], person['phone']))
def delete_person(self):
name = input('name: ')
for person in self.persons:
if person['name'] == name:
self.persons.remove(person)
break
def get_choice():
print('1. create person')
print('2. list all persons')
print('3. query person')
print('4. delete person')
print('5. quit')
choice = input('Enter a number(1-5):')
return choice
def main():
addressBook = AddressBook()
while True:
choice = get_choice()
if choice == '1':
addressBook.create_person()
elif choice == '2':
addressBook.list_person()
elif choice == '3':
addressBook.query_person()
elif choice == '4':
addressBook.delete_person()
elif choice == '5':
break
else:
print('Invalid choice')
main()
运行案例
点击 "运行案例" 可查看在线运行效果
Python 进阶应用教程
01 Python 的对象和类
02 Python 类属性和实例属性
03 Python类的构造方法、析构方法、实例方法
04 Python 类的私有属性和私有方法
05 Python 类的继承和多继承
06 Python 类实战
07 Python 中的迭代器实现原理
08 Python 中的迭代器趣味实践
09 Python 中的生成器实现原理
10 Python 中的生成器趣味实践
11 Python 中的错误和异常
12 Python 中的异常处理
13 Python 中的模块
14 Python 标准库之 os 模块
15 Python 标准库之 sys 模块
16 Python 标准库之 math 模块
17 Python 标准库之 random 模块
18 Python 标准库之 Json 模块
19 Python 标准库 datetime 模块
20 Python 中的常用第三方模块
21 Python 中的命名空间
22 Python 中的作用域
23 Python 中的文件 IO 操作
24 Python 基础实战
25 Python 内置函数
26 Python 中使用正则表达式
27 使用 Python 操作 MySQL 数据库
28 使用 Python 操作 Mongo 数据库
29 使用 Python 操作 Redis 数据库
30 使用 Python 发送一封邮件
31 threading 之 Thread 的使用
32 threading 之 Lock 的基本使用
33 Python 生产者消费者模型
34 Python 的内存管理与垃圾回收
35 Python 领域运用:网络爬虫
36 Python 领域运用:Web 开发
37 Python 领域运用:自动化运维
38 Python 领域运用:自动化测试
代码预览
退出