python反射例項化 python反射

2021-10-18 15:06:45 字數 2357 閱讀 9078

定義:

通過字串的形式去操作物件(類,例項物件,模組中的物件)中的成員(增刪改查)叫反射。

一、類例項物件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...