1. 程式人生 > >獲取物件資訊dir()及getattr()、setattr()以及hasattr()

獲取物件資訊dir()及getattr()、setattr()以及hasattr()

如果要獲得一個物件的所有屬性和方法,可以使用dir()函式,它返回一個包含字串的list,比如,獲得一個str物件的所有屬性和方法:

>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

類似__xxx__的屬性和方法在Python中都是有特殊用途的,比如__len__方法返回長度。在Python中,如果你呼叫len()函式試圖獲取一個物件的長度,實際上,在len()函式內部,它自動去呼叫該物件的__len__()方法

所以,下面的程式碼是等價的: 

>>> len('ABC')
3
>>> 'ABC'.__len__()
3

 們自己寫的類,如果也想用len(myObj)的話,就自己寫一個__len__()方法:

>>> class MyDog(object):
...     def __len__(self):
...         return 100
...
>>> dog = MyDog()
>>> len(dog)
100

 剩下的都是普通屬性或方法,比如lower()返回小寫的字串:

>>> 'ABC'.lower()
'abc'

 僅把屬性和方法列出來是不夠的,配合getattr()setattr()以及hasattr()

我們可以直接操作一個物件的狀態:

>>> class MyObject(object):
...     def __init__(self):
...         self.x = 9
...     def power(self):
...         return self.x * self.x
...
>>> obj = MyObject()

 緊接著,可以測試該物件的屬性:

>>> hasattr(obj, 'x') # 有屬性'x'嗎?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有屬性'y'嗎?
False
>>> setattr(obj, 'y', 19) # 設定一個屬性'y'
>>> hasattr(obj, 'y') # 有屬性'y'嗎?
True
>>> getattr(obj, 'y') # 獲取屬性'y'
19
>>> obj.y # 獲取屬性'y'
19

 如果試圖獲取不存在的屬性,會丟擲AttributeError的錯誤:

>>> getattr(obj, 'z') # 獲取屬性'z'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyObject' object has no attribute 'z'

 可以傳入一個default引數,如果屬性不存在,就返回預設值:

>>> getattr(obj, 'z', 404) # 獲取屬性'z',如果不存在,返回預設值404
404

 也可以獲得物件的方法:

>>> hasattr(obj, 'power') # 有屬性'power'嗎?
True
>>> getattr(obj, 'power') # 獲取屬性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn = getattr(obj, 'power') # 獲取屬性'power'並賦值到變數fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn() # 呼叫fn()與呼叫obj.power()是一樣的
81