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)
2.3 类 AddressBook 的主要成员方法
分析通讯录的功能需求,初步将程序划分为 4 个功能模块,如下表所示:
功能模块 | 成员方法 |
---|---|
增加联系人 | create_person |
列出联系人 | list_person |
查询联系人 | query_person |
删除联系人 | delete_person |
使用 4 个成员方法实现相应的功能,这里先写出成员方法的定义,暂时忽略实现,代码如下:
class AddressBook:def __init__(self):self.persons = []def create_person(self):passdef list_person(self):passdef query_person(self):passdef delete_person(self):pass
2.4 主控模块
本节完成程序的主功能模块 main,函数 main 的功能逻辑如下:
def get_choice():passdef 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':breakelse:print('Invalid choice') main()
2.5 获取用户输入
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
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)
在第 6 行,将联系人加入到 self.persons 中
4. 列出联系人
本小节实现列出所有联系人的功能,如下所示:
def list_person(self):for person in self.persons:print('%s,%s,%s' % (person['name'], person['address'], person['phone']))
对每个联系人打印输出一行,假设通讯录中已经存储了张三和李四两个联系人,输出如下:
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
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']))
在第 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
在第 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 choicedef 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':breakelse:print('Invalid choice') main()