Python內建函式getattr的使用場景

2021-10-08 17:46:40 字數 1492 閱讀 4001

在python互動式的help環境下,輸入getattr,回車,會得到下面的資訊:

既然getattr(alex,'age') 和 alex.age都能獲取alex物件的age屬性的值,那我們使用後者不就行了嗎?畢竟點語法看起來比getattr函式簡單多了,不用寫那麼多字。確實,一般情況下,使用點語法來獲取屬性值非常方便。但是也存在一些場景,點語法無能為力,只好使用getattr函式來獲取屬性值。

究竟應該使用誰,關鍵就在於,編寫**的時候程式設計師是否能夠確定要獲取哪個屬性的值。

如果我明確地知道,我就是想要獲取age這個屬性的值,那麼alex.age就滿足了我的需求。但是,試想如下的場景:

alex物件有name,age,job,weight,height五個屬性,我們要根據使用者的選擇來展示相應的屬性。也就是說,使用者告訴程式「給我看看alex的身高吧!」,程式就要把height屬性的值展示給使用者看。

上面這個場景中,程式設計師寫**的時候無法確定要訪問哪個屬性值,選擇權是交給使用者的。而使用者的輸入是乙個字串"height",字串在alex.height這樣的點語法裡並沒有容身之處。怎麼樣?這個需求用點語法不太合適了吧?(如果非要用點語法,也不是不可以。比如,用乙個字典把alex所有的屬性值都存起來。鍵就是「height」這樣的字串,值就是alex.height這樣的屬性值。那麼,就可以用「height"這樣的字串把對應的屬性值取出來了。不過這個方法沒有接下來要說到的getattr好。)這時候,用getattr就非常合適了。因為,getattr的第二個引數型別正是字串!我們可以用getattr(alex,"height")來取出身高的值。我們甚至還可以使用default引數很好地解決使用者輸入的屬性不存在的問題。

示例**如下:

from typing import namedtuple

class person(namedtuple):

'''人類'''

name: str

age: int

job: str

weight: float

height: float

alex = person('alex', 32, 'actor', 60, 178)

# 把使用者輸入的字串賦值給變數attribute_name

attribute_name = input('''what do you want to know about alex?

enter an attribute name>>>''')

# 注意,上述字串被傳進了這個函式作為第二個引數

# 第三個引數是屬性不存在時返回的字串

print(getattr(alex,attribute_name, 'sorry, this attribute does not exist.'))

python重寫內建函式 python 內建函式

說明 zip 函式用於將可迭代的物件作為引數,將物件中對應的元素打包成乙個個元組,然後返回由這些元組組成的列表。如果各個迭代器的元素個數不一致,則返回列表長度與最短的物件相同,利用 號操作符,可以將元組解壓為列表。語法 zip iterable1,iterable2,引數 iterable 乙個或多...

python內建函式簡稱 Python內建函式詳解

此文參考python文件,然後結合自己的理解,寫下來,一方面方便自己,讓自己好好學習,順便回憶回憶 另一方面,讓喜歡的盆友也參考一下。經查詢,3.6版本總共有68個內建函式,主要分類如下 數 算 7個 型別轉換 24個 序列操作 8個 物件操作 9個 反射操作 8個 變數操作 2個 互動操作 2個 ...

python內建函式使用 python內建函式使用

eval函式執行python表示式,有返回值 eval 1 2 3 4 5 exec函式執行的是python語句,沒有返回值 exec print 123 將字串型別的 編碼.物件能夠通過exec語句來執行或者eval 進行求值,c只是編譯,不執行 code for i in range 10 pr...