Python 類實(shí)戰(zhàn)
還是以我們之前做過的,通訊錄功能為例,這節(jié)課我們繼續(xù)對通訊錄功能使用類進(jìn)行改造:
1. 通訊錄功能簡介
編寫程序 addressBook.py 實(shí)現(xiàn)通訊錄管理系統(tǒng),通訊錄包含若干聯(lián)系人,每個(gè)聯(lián)系人包括:姓名、地址、電話 3 項(xiàng)內(nèi)容。程序提供 4 項(xiàng)基本功能:
- 增加聯(lián)系人: 用戶輸入姓名、地址、電話等信息,將信息保存在一個(gè)列表中
- 列出聯(lián)系人: 打印輸出所有聯(lián)系人的信息
- 查詢聯(lián)系人: 用戶輸入聯(lián)系人姓名,打印輸出該聯(lián)系人的信息
- 刪除聯(lián)系人: 用戶輸入聯(lián)系人姓名,從通訊錄中刪除該聯(lián)系人
通過命令行界面實(shí)現(xiàn)以上功能,程序 addressBook.py 運(yùn)行時(shí)首先打印一個(gè)菜單,如下所示:
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 個(gè)選項(xiàng),用戶輸入對應(yīng)的數(shù)字選擇相應(yīng)的功能,如下表所示:
數(shù)字選項(xiàng) | 功能描述 |
---|---|
1. create person | 增加聯(lián)系人 |
2. list all persons | 列出聯(lián)系人 |
3. query person | 查詢聯(lián)系人 |
4. delete person | 刪除聯(lián)系人 |
5. quit | 退出通訊錄程序 |
2. 程序框架
2.1 描述單個(gè)聯(lián)系人的數(shù)據(jù)結(jié)構(gòu)
程序使用字典描述一個(gè)聯(lián)系人,假設(shè)某個(gè)聯(lián)系人的信息如下:
姓名 | 地址 | 電話 |
---|---|---|
張三 | 南京 | 12306 |
使用字典描述該聯(lián)系人如下:
>>> person = {'name': '張三', 'address': '南京', 'phone': '12306'}
- 字典有三個(gè)鍵:name、address、phone
- 對應(yīng)的值分別為:張三、南京、12306
2.2 描述所有聯(lián)系人的數(shù)據(jù)結(jié)構(gòu)
程序?qū)⑺新?lián)系人信息存儲在列表中,即通訊錄是一個(gè)列表、列表的元素是字典。假設(shè)通訊錄中有兩個(gè)人,它們的信息如下所示:
姓名 | 地址 | 電話 |
---|---|---|
張三 | 南京 | 12306 |
李四 | 王五 | 10086 |
本節(jié)使用面向?qū)ο蟮纳显O(shè)計(jì)方法實(shí)現(xiàn)通訊錄,使用一個(gè)類 AddressBook 描述通訊錄,類 AddressBook 的核心成員是一個(gè)列表,該列表保存了所有聯(lián)系人, 代碼如下:
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,它是一個(gè)列表,記錄了所有的聯(lián)系人
- 在第 5 行,定義了成員方法 addPerson,它將單個(gè)聯(lián)系人加入到聯(lián)系人列表中
- 在第 8 行,使用類 AdressBook 創(chuàng)建一個(gè)對象
- 創(chuàng)建兩個(gè)聯(lián)系人
- 在第 9 行,變量 zhangSan 的類型是一個(gè)字典,描述了張三的信息
- 在第 10 行,變量 liSi 的類型是一個(gè)字典,描述了李四的信息
- 將聯(lián)系人添加到通訊錄中
- 在第 11 行,將聯(lián)系人 zhangSan 添加到通訊錄中
- 在第 12 行,將聯(lián)系人 liSi 添加到通訊錄中
2.3 類 AddressBook 的主要成員方法
分析通訊錄的功能需求,初步將程序劃分為 4 個(gè)功能模塊,如下表所示:
功能模塊 | 成員方法 |
---|---|
增加聯(lián)系人 | create_person |
列出聯(lián)系人 | list_person |
查詢聯(lián)系人 | query_person |
刪除聯(lián)系人 | delete_person |
使用 4 個(gè)成員方法實(shí)現(xiàn)相應(yīng)的功能,這里先寫出成員方法的定義,暫時(shí)忽略實(shí)現(xiàn),代碼如下:
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 主控模塊
本節(jié)完成程序的主功能模塊 main,函數(shù) main 的功能邏輯如下:
- 獲取用戶輸入的選擇
- 根據(jù)用戶的選擇執(zhí)行對應(yīng)的功能
- 重復(fù)執(zhí)行第 1 步的操作
函數(shù) main 的實(shí)現(xiàn)代碼如下:
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 行,定義了函數(shù) get_choice,該函數(shù)打印功能菜單并讀取用戶的選擇
- 在第 4 行,定義了函數(shù) main,該函數(shù)讀取用戶選擇,并執(zhí)行相應(yīng)功能
- 在第 5 行,使用類 AdressBook 創(chuàng)建一個(gè)對象 addressBook
- 在第 6 行,創(chuàng)建一個(gè) while 死循環(huán)
- 在第 7 行,使用 get_choice() 函數(shù)獲取用戶輸入的選擇
- 在第 9 行至第 20 行,根據(jù) choice 執(zhí)行對象 addressBook 相應(yīng)的成員方法
- 在第 18 行,如果 choice == ‘5’,則執(zhí)行 break 退出程序
2.5 獲取用戶輸入
編寫函數(shù) 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() 函數(shù)獲取用戶輸入的選擇
- 在第 8 行,返回用戶的選擇 choice
3. 增加聯(lián)系人
本小節(jié)實(shí)現(xiàn)增加聯(lián)系人的功能,如下所示:
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 行,定義函數(shù) create_person,該函數(shù)實(shí)現(xiàn)增加聯(lián)系人的功能
- 在第 2 行,獲取用戶輸入的 name
- 在第 3 行,獲取用戶輸入的 address
- 在第 4 行,獲取用戶輸入的 phone
- 在第 5 行,根據(jù)用戶輸入的 name、address、phone 創(chuàng)建一個(gè)字典,用于描述該聯(lián)系人
- 在第 6 行,將聯(lián)系人加入到 self.persons 中
4. 列出聯(lián)系人
本小節(jié)實(shí)現(xiàn)列出所有聯(lián)系人的功能,如下所示:
def list_person(self):
for person in self.persons:
print('%s,%s,%s' % (person['name'], person['address'], person['phone']))
- 在第 1 行,定義函數(shù) list_person,實(shí)現(xiàn)列出所有聯(lián)系人的功能
- 在第 2 行,遍歷列表 self.persons,循環(huán)變量 self.persons 是一個(gè)字典
- 在第 3 行,打印變量 person 的內(nèi)容
對每個(gè)聯(lián)系人打印輸出一行,假設(shè)通訊錄中已經(jīng)存儲了張三和李四兩個(gè)聯(lián)系人,輸出如下:
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 行,用戶選擇執(zhí)行功能 2
- 在第 8 行,打印聯(lián)系人張三的信息
- 在第 9 行,打印聯(lián)系人李四的信息
5. 查詢聯(lián)系人
本小節(jié)實(shí)現(xiàn)查詢聯(lián)系人的功能,如下所示:
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 行,定義函數(shù) query_person,實(shí)現(xiàn)查詢聯(lián)系人的功能
- 在第 2 行,獲取用戶輸入的 name
- 在第 3 行,遍歷列表 self.persons,循環(huán)變量 self.persons 是一個(gè)字典
- 在第 4 行,如果用戶輸入的 name 和循環(huán)訪問 person 的 name 相同,則表示找到指定的 person
- 在第 5 行,打印變量 person 的內(nèi)容
6. 刪除聯(lián)系人
本小節(jié)實(shí)現(xiàn)刪除聯(lián)系人的功能,如下所示:
def delete_person(self):
name = input('name: ')
for person in self.persons:
if person['name'] == name:
self.persons.remove(person)
break
- 在第 1 行,定義函數(shù) delete_person,實(shí)現(xiàn)刪除聯(lián)系人的功能
- 在第 2 行,獲取用戶輸入的 name
- 在第 3 行,遍歷列表 self.persons,循環(huán)變量 self.persons 是一個(gè)字典
- 在第 4 行,如果用戶輸入的 name 和循環(huán)訪問 person 的 name 相同,則表示找到指定的 person
- 在第 5 行,使用方法 self.persons.remove(person),從 self.persons 中刪除元素 person
- 在第 6 行,退出 for 循環(huán)
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()