python中的自省與反射
由於python是一門強型別的動態解釋型語言,故我們在某些時候並不會知道(特別是與別人對接開發工作的時候)物件中具有的屬性與方法。
這個時候我們並不能直接通過 .或者檢視底層的 __dict__ 方法來獲得該物件下的屬性與方法,我們需要使用一種更文明的方式來獲取該物件下的屬性與方法,故這種文明的方式被稱之為反射。
自省和反射是兩個比較專業化的術語dmlmw,首先自省是獲取物件的能力,而反射是操縱物件的能力。
python中使用delattr()和setattr()實現反射,而其他方法則屬於自省。
反射和自省常常組合使用!
python中關於反射與自省的部分方法
常用方法
dir()
返回乙個列表,儲存該物件下能被 . 出的所有屬性與方法。
hasattr()
檢視物件是否具有某種屬性或方法,返回true或者false。
getattr()
獲取物件下的某一屬性或方法。如被獲取物件沒有相應的屬性或方法,則www.cppcns.com可以為其設定預設值。
setattr()
設定物件下的某一屬性的值,通常我們不會在物件外部為其新增某一方法,而是在在物件的類中進行設定。
delattr()
刪除物件中的某一屬性或方法。
其他的一些方法
help()
獲取物件的幫助資訊,注意。沒有返回值!內部會呼叫print()進行列印操作。
issubclass()
判斷乙個類是不是另乙個類的子類
isinstance()
判斷乙個物件是否是乙個已知的型別
id()
返回儲存物件的記憶體位址編號
callable()
判斷物件是否可呼叫
注意:於一切皆物件的原則,我們不僅可以對例項物件進行自省與反射,也可程式設計客棧以對類物件進行自省與反射。
操作演示
應用場景
# ==== 這樣做的好處是即使使用者輸入有誤,也不會丟擲異常 ====
import sys
class downloadandupload(object):
def __init__(self):
self.val = sys.ar**[1]
self.select()
def download(self):
print("正在**...")
def upload(self):
print("正在上傳...")
def select(self):
if hasattr(self,self.val):
getattr(self,self.val)()
else:
print("沒有該方法")
downloadadmlmwndupload()
擴充套件與後言:反射內部實現機制
其實我想了好一會要不要寫這個,內部實現機制。這一些內容應該放在雙下方法學完之後才應該講反射實現的內部機制。所以這裡提一嘴:
本文標題: python自省及反射原理例項詳解
本文位址:
python反射 自省
反射 自省 的簡單理解 通過類名例項化物件 得到類的所有屬性和函式,並實現呼叫 簡單示例 coding utf 8 class user object def init self self.name abc self.age 18 defintroduce self print my name is...
python反射(自省)
前幾天用owlready構建rdf檔案時,使用類定義實體,屬性和資料屬性,類名就是乙個object,所有建立例項都需要例項類,但是現在資料有很多,我需要讓他們自動建立類的例項,他們的型別為字串,我需要把他們轉為該字串對應的類名,這裡提供了乙個方法 eval 例如name nametype 字串 cl...
python 反射 自省 inspect
自省 自省。正如你所知道的,自省是指 可以檢視記憶體中以物件形式存在的其它模組和函式,獲取它們的資訊,並對它們進行操作。用這種方法,你可以定義沒有名稱的函式,不按函式宣告的引數順序呼叫函式,甚至引用事先並不知道名稱的函式。反射有時候我們會碰到這樣的需求,需要執行物件的某個方法,或是需要對物件的某個字...