亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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. 獲取用戶輸入的選擇
  2. 根據用戶的選擇執行對應的功能
  3. 重復執行第 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()       
運行案例 點擊 "運行案例" 可查看在線運行效果