python反射示例

2021-07-16 06:33:08 字數 2809 閱讀 8048

本文用到的檔案test.py,person.py,sqlserverhelper.py,mysqlhelper.py所在的工程如下圖:

person.py檔案內容:

class person():

def __init__(self):

self.name='python'

def getname(self):

return self.name

1》未使用反射:

test.py檔案內容:

from person import person

p=person()

print p.getname()

結果:

python

2》反射示例一:

test.py檔案內容:

from person import person

p = globals()["person"]()

print getattr(p,'name')

print getattr(p,'getname')()

結果:

python

python

3》反射示例二:(動態匯入模組)

test.py檔案內容:

module = __import__("person")

p = getattr(module, "person")()

print hasattr(p,'name')

print getattr(p,'name')

print getattr(p,'getname')()

結果:

true

python

python

4》反射示例三:開發大型程式,期望能夠隨時切換資料庫(動態匯入)

sqlserverhelper.py檔案內容:

#!/usr/bin/env python

#coding:utf-8

def count():

return 2

name='sqlserverhelper'

mysqlhelper.py檔案內容:

#!/usr/bin/env python

#coding:utf-8

def count():

return 1

name='mysqlhelper'

test.py檔案內容:

#!/usr/bin/env python

#coding:utf-8

temp='mysqlhelper'

module=__import__(temp)#反射:以字串的形式匯入模組

print module.count() #正常呼叫count函式

func='count' #反射:以字串的形式執行函式

f=getattr(module,func) #查詢函式count

print f()

print hasattr(module,'fun'),hasattr(module,'count'),getattr(module,'count')

print hasattr(module,'s'),hasattr(module,'name'),getattr(module,'name')

執行test.py,結果: 11

false true

false true mysqlhelper

若要切換到sqlserverhelper,僅需要修改一行,修改後的test.py如下:

temp='sqlserverhelper'#僅僅需要修改這一行

module=__import__(temp)#反射:以字串的形式匯入模組

print module.count() #正常呼叫count函式

func='count' #反射:以字串的形式執行函式

f=getattr(module,func) #查詢函式count

print f()

print hasattr(module,'fun'),hasattr(module,'count'),getattr(module,'count')

print hasattr(module,'s'),hasattr(module,'name'),getattr(module,'name')

執行結果:22

false true

false true sqlserverhelper

另外:delattr(module,'count')#刪除屬性

hasattr(module,'count')#判斷屬性是否存在

反射小結:

1》通過類名獲得類的例項物件

2》通過方法名得到方法,實現呼叫

3》使用__import__方法匯入模組之後,獲得模組中的屬性和方法使用getattr()方法

使用__import__只能匯入檔案(模組), 到class級別或函式級別或變數級別應該使用getattr。

獲得類以後, 要建立例項物件, 在getattr()後再加上(),

不管屬性和方法都使用getattr獲得, 如果要呼叫方法, 使用getattr(xx,'method')()

C 反射使用示例

分享一下自己寫的使用反射的例子,包括根據名字獲取屬性值 字段 類的示例對,如自己申明的類或者list等 呼叫函式 無參 有參 介面如下 貼上 namespace relectiontest public int age 16 public men li new men 李四 private int ...

關於反射的簡單示例

先寫乙個從字串生成任何型別的物件的函式 public object stringtoobject string str,type objecttype 傳遞兩個引數,乙個是字串含有每個屬性的屬性名和值對,屬性和值用冒號分隔,屬性與屬性用逗號分隔,另乙個引數是要建立的物件的型別 將字串分解成 屬性 值...

python 反射 python中的反射

什麼是反射?有時我們要訪問某個變數或是方法時並不知道到底有沒有這個變數或方法,所以就要做些判斷。判斷是否存在字串對應的變數及方法。我們知道訪問變數時是不能加引號的,否則會被當成字串處理。如果要通過字串找到對應的變數,那該怎麼辦呢 反射就是用於解決上面兩個問題而產生的,所謂反射,按我的理解就是反過來告...