首先通過一個例子來看一下本文中可能用到的對象和相關概念。
代碼如下:
#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框架時,可能需要對數據對象的字段賦值,但我們無法預知用到這個框架的數據對象都有些什么字段,換言之,我們在寫框架的時候需要通過某種機制訪問未知的屬性。
這個機制被稱為反射(反過來讓對象告訴我們他是什么),或是自?。ㄗ寣ο笞约焊嬖V我們他是什么,好吧我承認括號里是我瞎掰的- -#),用于實現在運行時獲取未知對象的信息。反射是個很嚇唬人的名詞,聽起來高深莫測,在一般的編程語言里反射相對其他概念來說稍顯復雜,一般來說都是作為高級主題來講;但在Python中反射非常簡單,用起來幾乎感覺不到與其他的代碼有區別,使用反射獲取到的函數和方法可以像平常一樣加上括號直接調用,獲取到類后可以直接構造實例;不過獲取到的字段不能直接賦值,因為拿到的其實是另一個指向同一個地方的引用,賦值只能改變當前的這個引用而已。
1. 訪問對象的屬性
以下列出了幾個內建方法,可以用來檢查或是訪問對象的屬性。這些方法可以用于任意對象而不僅僅是例子中的Cat實例對象;Python中一切都是對象。
代碼如下:
cat
= Cat('kitty')
print cat.name
#
訪問實例屬性
cat.sayHi()
#
調用實例方法
print dir(cat)
#
獲取實例的屬性名,以列表形式返回
if hasattr(cat,
'name'):
#
檢查實例是否有這個屬性
新聞熱點
疑難解答