国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python中動態獲取對象的屬性和方法的教程

2020-02-23 00:38:58
字體:
來源:轉載
供稿:網友

首先通過一個例子來看一下本文中可能用到的對象和相關概念。

 #coding: UTF-8 import sys # 模塊,sys指向這個模塊對象 import inspect def foo(): pass # 函數,foo指向這個函數對象  class Cat(object): # 類,Cat指向這個類對象 def __init__(self, name='kitty'): self.name = name def sayHi(self): # 實例方法,sayHi指向這個方法對象,使用類或實例.sayHi訪問 print self.name, 'says Hi!' # 訪問名為name的字段,使用實例.name訪問  cat = Cat() # cat是Cat類的實例對象  print Cat.sayHi # 使用類名訪問實例方法時,方法是未綁定的(unbound) print cat.sayHi # 使用實例訪問實例方法時,方法是綁定的(bound)

有時候我們會碰到這樣的需求,需要執行對象的某個方法,或是需要對對象的某個字段賦值,而方法名或是字段名在編碼代碼時并不能確定,需要通過參數傳遞字符串的形式輸入。舉個具體的例子:當我們需要實現一個通用的DBM框架時,可能需要對數據對象的字段賦值,但我們無法預知用到這個框架的數據對象都有些什么字段,換言之,我們在寫框架的時候需要通過某種機制訪問未知的屬性。

這個機制被稱為反射(反過來讓對象告訴我們他是什么),或是自省(讓對象自己告訴我們他是什么,好吧我承認括號里是我瞎掰的- -#),用于實現在運行時獲取未知對象的信息。反射是個很嚇唬人的名詞,聽起來高深莫測,在一般的編程語言里反射相對其他概念來說稍顯復雜,一般來說都是作為高級主題來講;但在Python中反射非常簡單,用起來幾乎感覺不到與其他的代碼有區別,使用反射獲取到的函數和方法可以像平常一樣加上括號直接調用,獲取到類后可以直接構造實例;不過獲取到的字段不能直接賦值,因為拿到的其實是另一個指向同一個地方的引用,賦值只能改變當前的這個引用而已。
1. 訪問對象的屬性

以下列出了幾個內建方法,可以用來檢查或是訪問對象的屬性。這些方法可以用于任意對象而不僅僅是例子中的Cat實例對象;Python中一切都是對象。

 cat = Cat('kitty')  print cat.name # 訪問實例屬性 cat.sayHi() # 調用實例方法  print dir(cat) # 獲取實例的屬性名,以列表形式返回 if hasattr(cat, 'name'): # 檢查實例是否有這個屬性 setattr(cat, 'name', 'tiger') # same as: a.name = 'tiger' print getattr(cat, 'name') # same as: print a.name  getattr(cat, 'sayHi')() # same as: cat.sayHi()

    dir([obj]):
    調用這個方法將返回包含obj大多數屬性名的列表(會有一些特殊的屬性不包含在內)。obj的默認值是當前的模塊對象。
    hasattr(obj, attr): 
    這個方法用于檢查obj是否有一個名為attr的值的屬性,返回一個布爾值。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大石桥市| 莆田市| 桂东县| 岢岚县| 平定县| 平舆县| 南漳县| 秀山| 抚宁县| 施秉县| 乐亭县| 虹口区| 梁山县| 新余市| 和平县| 大连市| 高清| 汶川县| 咸丰县| 冷水江市| 惠东县| 客服| 河津市| 神木县| 康平县| 克东县| 新竹县| 葫芦岛市| 海安县| 平和县| 锡林郭勒盟| 扬中市| 蕲春县| 运城市| 屏东市| 长岭县| 景洪市| 景洪市| 永平县| 方山县| 任丘市|