python 反射 自省 inspect

2022-09-16 18:09:08 字數 2555 閱讀 8180

自省

自省。正如你所知道的,

,自省是指**可以檢視記憶體中以物件形式存在的其它模組和函式,獲取它們的資訊,並對它們進行操作。用這種方法,你可以定義沒有名稱的函式,不按函式宣告的引數順序呼叫函式,甚至引用事先並不知道名稱的函式。

反射

有時候我們會碰到這樣的需求,需要執行物件的某個方法,或是需要對物件的某個字段賦值,而方法名或是欄位名在編碼**時並不能確定,需要通過引數傳遞字串的形式輸入。舉個具體的例子:當我們需要實現乙個通用的dbm框架時,可能需要對資料物件的字段賦值,但我們無法預知用到這個框架的資料物件都有些什麼字段,換言之,我們在寫框架的時候需要通過某種機制訪問未知的屬性。

這個機制被稱為反射(反過來讓物件告訴我們他是什麼),或是自省(讓物件自己告訴我們他是什麼,好吧我承認括號裡是我瞎掰的- -#),用於實現在執行時獲取未知物件的資訊。反射是個很嚇唬人的名詞,聽起來高深莫測,在一般的程式語言裡反射相對其他概念來說稍顯複雜,一般來說都是作為高階主題來講;但在python中反射非常簡單,用起來幾乎感覺不到與其他的**有區別,使用反射獲取到的函式和方法可以像平常一樣加上括號直接呼叫,獲取到類後可以直接構造例項;不過獲取到的字段不能直接賦值,因為拿到的其實是另乙個指向同乙個地方的引用,賦值只能改變當前的這個引用而已。

#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)

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引數的作...