常規(guī)場景
先來看一個案例。
學生信息系統(tǒng)中數(shù)據(jù)為固定格式(姓名,年齡,性別,郵箱地址),學生數(shù)據(jù)很大為了減小存儲開銷,對每個學生我們用元組表示。但是,訪問時,我們通常使用索引(index)訪問,大量的索引降低了程序的可讀性。
# 現(xiàn)有如下的一些元組
# ('Jim', 16, 'male', 'jim@ursb.me')
# ('Airing', 20, 'male', 'airing@ursb.me')
# ('Lucy', 16, 'female', 'lucy@ursb.me')
student = ('Jim', 16, 'male', 'jim@ursb.me')
# name
print student[0]
# age
print student[1]
# sex
print student[2]
可見,程序中將會大量的出現(xiàn)一些純數(shù)字的索引值,非常不利于程序的維護,可讀性很差,一眼看不出其含義。
C 語言中的解決方案
C 語言中,可以使用宏定義的方式解決這個問題:
#define NAME 0
#define AGE 1
也可以使用枚舉類型解決:
enum Student{
NAME,
AGE,
SEX,
}
Python 中優(yōu)雅的解決方案
方案1:定義類似C語言中的枚舉類型
這種方法,也就是定義一系列的數(shù)值常量
NAME = 0
AGE = 1
SEX = 2
EMAIL = 3
# 或者 NAME, AGE, SEX, EMAIL = xrange(4)
student = ('Airing', 20, 'male', 'airing@ursb.me')
# name
print student[NAME]
# age
print student[AGE]
# sexprint student[SEX]
方案2:使用標準庫中collections.namedtuple替代內(nèi)置tuple
from collections import namedtuple
# 相當于類的工廠
Student = namedtuple('Student', ['name', 'age', 'sex', 'email'])
# 相當于實例化類對象
s = Student('Airing', 20, 'male', 'airing@ursb.me')
# 也可以使用關(guān)鍵字傳參,但是位置需要對應(yīng)
s2 = Student(name='Jim', age=16, sex='male', email='jim@ursb.me')
# 訪問元素相當于訪問對象的屬性
s.name
s.age
s.sex
# s也是內(nèi)置類型 tuple 的子類
isinstance(s, tuple) # => True
是不是優(yōu)雅方便了許多呢?