本文和大家分享的主要是python
內(nèi)建函數(shù)getattr()相關(guān)內(nèi)容,一起來看看吧,希望對大家
學(xué)習(xí)python 有所幫助。
上述代碼查看傳送門
記錄
getattr
是
python
里的一個內(nèi)建函數(shù)
,
先看定義
>>> help(getattr)
Help
on built-
in
function getattr
in
module __builtin__:
getattr(...)
getattr(object, name[,
default]) -> value
Get a named attribute
from an object; getattr(x, 'y') is equivalent to x.y.
When a
default argument
is given, it
is returned
when the attribute doesn't
exist; without it, an exception
is raised
in that
case.
>>>
getattr()
的三個參數(shù):
· object :
要實例化的對象
· name
: 要執(zhí)行的命令操作
· default :
(可省略參數(shù))當(dāng)要執(zhí)行的命令操作不存在是,會返回這里傳入的
default
getattr()
主要的作用是通過傳入字符串的方式,來動態(tài)的獲取方法的實例。這個函數(shù)最大的用處在于函數(shù)解耦,可以講一些可能會調(diào)用的方法,寫到一個配置文件中,在需要的時候動態(tài)加載。
解釋的比較抽象,簡單來說:
getattr(object, name)
等價于
object.name
下面通過代碼說明一下
for i in range(t):
c, *
args =
map(str,input().
split())
getattr(s,
c) (*(
int(
x)
for
x in
args))
這段代碼實現(xiàn)了用戶從
stdin
輸入命令和參數(shù),命令賦值給了
c
,參數(shù)傳給了一個指針變量
*args ,
這里使用
*args
是為了接收不確定個數(shù)的參數(shù)。然后調(diào)用
getattr(s,c)
來執(zhí)行
c
這條指令(注:
s
是一串字符串),此處
getattr(s,c)
就可以等價于
s.c ,
后面括號內(nèi)
(*(int(x) for x in args)) ,
這里是一個生成器表達(dá)式,這部分稱為參數(shù)解包,它類似于如何定義具有任意數(shù)量(位置)參數(shù)的函數(shù)
—
*
在序列之前將遍歷序列并將其成員變?yōu)楹瘮?shù)調(diào)用參數(shù)。
可以看出,這樣的用法比枚舉的思路方便了很多,也具有更高的擴(kuò)展性。
延伸
Python
中和
getattr
相關(guān)的還有
hasattr
、
setattr
、
delattr
,通過舉例了解一下。
#
定義一個類對象
class
Vimiix:
def
__init__(self):
self.name = 'vimiix'
def
setName(self, name):
self.name = name
def
getName(self):
return self.name
#
實例化對象
foo = Vimiix()
hasattr(object, name) 判斷object是否具有name屬性
>>>hasattr(foo,'getName')
True
setattr(object,name,default) 設(shè)置一個新的屬性,并賦予值.類似foo.age = 18
>>>setattr(foo, 'age', '18')
delattr(object, name) 刪除object對象的name屬性
>>>delattr(foo, 'age')>>>getattr(foo, 'age', 'Not find')
'Not find'
來源:Vimiix