定義:
通過字串的形式去操作物件(類,例項物件,模組中的物件)中的成員(增刪改查)叫反射。
一、類例項物件class foo:
tests = 'test'
def __init__(self,name,age):
self.name = name
self.age = age
def show(self):
return "%s - %s" %(self.name,self.age)
obj = foo("san",18)
對於以上foo類例項化出物件obj,在以往我們操作obj中的物件時
print(obj.name)
n = "name"
print(obj.__dict__["name"])
或print(obj.__dict__[n])
來獲取 ojb.name欄位
下面用反射來對類例項化物件obj中的字段進行操作
#getattr 獲取字段內容while true:
inp = input(">>>") #輸入要獲取的字段物件名
if hasattr(obj,inp): #判斷字段是否存在
v = getattr(obj,inp)
if callable(v): #判斷是否可呼叫
print(v())
else:
print(v)
else:
print("%s 不存在" %inp)
執行結果:
當輸入物件是首先通過hasattr來檢查所輸入的字段物件是否存在,存在時則列印,不存在給出提示,輸入show時,由於show是foo中的方法,所以被呼叫,列印出san - 18
#setattr 向物件中賦值欄位class foo:
def __init__(self,name,age):
self.name = name
self.age = age
setattr(obj,'***',"男") #放在obj物件記憶體中
以上操作等同於obj.*** = "男",往物件中新增字段
同理能新增就能刪除
##delattr
# delattr(obj,"name")
# print(obj.name)
這個請自行測試吧
以上是通過類的反射操作物件的字段或方法,下面來說下模組檔案中反射
二、模組中反射應用
假設fs2.py中都是**的功能f1,f2,f3等,通過反射獲取並返回值,不存在返回404
這就是python web框架的路由的模擬。
模組檔案fs2.pyname = "san"
def func():
return 'func'
class foo:
def __init__(self):
self.name = 123
def f1():
return "首頁"
def f2():
return "新聞"
def f3():
return "精華"
bin.py內容import fs2
r1 = fs2.name
r2 = fs2.func()
print(r1,r2)
r1 = getattr(fs2,"name")
print(r1)
r2 = getattr(fs2,'func')
print(r2)
print(r2())
cls = getattr(fs2,'foo') ##模組中獲取類
print(cls)
obj = cls()
print(obj)
print(obj.name)
inp = input("請輸入要檢視的url:")
if hasattr(fs2,inp):
func = getattr(fs2,inp)
result = func()
print(result)
else:
print(404)
執行結果:
以上完整的模擬了從模組中檔案獲取全已有變數,函式,類。
python反射例項化 Python的類反射機制
反射就是通過字串的形式,匯入模組 通過字串的形式,去模組尋找指定函式並執行。python有四個內建函式 函式功能 getattr object,attr default 獲取指定字串名稱的物件屬性或方法,如果物件有該屬性則返回屬性值,如果有該方法則返回該方法的記憶體位址,如果都沒有就報錯,如果指定了...
Java程式設計 反射( 反射例項化物件)
反射例項化物件 若有了class類物件,則可以做到利用反射來實現物件例項化操作。1 例項化物件方法 public tnewinstance throws instantiationexception,illegalacces ception 建立此 class 物件所表示的類的乙個新例項。如同用乙個...
(反射應用案例)反射例項化物件
獲取class物件最大的意義是class類裡面提供有乙個物件的反射例項化方法 代替了關鍵字new 範例 通過newinstance 例項化乙個物件 建立person類package reflect public class person override public string tostring...