自省
自省。正如你所知道的,
,自省是指**可以檢視記憶體中以物件形式存在的其它模組和函式,獲取它們的資訊,並對它們進行操作。用這種方法,你可以定義沒有名稱的函式,不按函式宣告的引數順序呼叫函式,甚至引用事先並不知道名稱的函式。
反射
有時候我們會碰到這樣的需求,需要執行物件的某個方法,或是需要對物件的某個字段賦值,而方法名或是欄位名在編碼**時並不能確定,需要通過引數傳遞字串的形式輸入。舉個具體的例子:當我們需要實現乙個通用的dbm框架時,可能需要對資料物件的字段賦值,但我們無法預知用到這個框架的資料物件都有些什麼字段,換言之,我們在寫框架的時候需要通過某種機制訪問未知的屬性。這個機制被稱為反射(反過來讓物件告訴我們他是什麼),或是自省(讓物件自己告訴我們他是什麼,好吧我承認括號裡是我瞎掰的- -#),用於實現在執行時獲取未知物件的資訊。反射是個很嚇唬人的名詞,聽起來高深莫測,在一般的程式語言裡反射相對其他概念來說稍顯複雜,一般來說都是作為高階主題來講;但在python中反射非常簡單,用起來幾乎感覺不到與其他的**有區別,使用反射獲取到的函式和方法可以像平常一樣加上括號直接呼叫,獲取到類後可以直接構造例項;不過獲取到的字段不能直接賦值,因為拿到的其實是另乙個指向同乙個地方的引用,賦值只能改變當前的這個引用而已。
#coding: utf-8import 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)
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()
獲取呼叫者的詳細資訊
the caller's frame is one frame higher than the current frame.
you can use inspect.getouterframes to get the caller's frame, plus the filename and line number.
1#!/usr/bin/env python2#
coding: utf-834
import
inspect56
defhello():
7 frame,filename,line_number,function_name,lines,index=\
8 inspect.getouterframes(inspect.currentframe())[1]
9print
(frame,filename,line_number,function_name,lines,index)
10hello()
1112
#(, '/home/unutbu/pybin/test.py', 10, '', ['hello()\n'], 0)
@prosseek: to get the caller's caller, just change the index [1] to [2]. (inspect.getouterframes returns a list of frames...). python is beautifully organized.
「frame records,」 each record is a tuple of six items:
the frame object,
the filename,
the line number of the current line,
the function name,
a list of lines of context from the source code,
and the index of the current line within that list.
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 物件導向 反射 自省
反射 程式可以訪問,檢測和修改它本身狀態或行為的一種能力 自省 下面就介紹四種實現自省的函式,適用於類和物件 1,判斷object中有沒有乙個name字串對應的屬性或者方法 hasattr object,name 2,獲取object中name字串對應的屬性值或者方法位址,其中default引數的作...