Python 反射
阿新 • • 發佈:2022-01-21
Python 反射
以字串的形式去操作某個物件中的成員(Python中一切皆物件)
-
概述
getattr()
,setattr()
,delattr()
為 Python 的內建方法。
1.getattr
用來獲取物件的屬性或者方法,(注:獲取到方法,但是並未執行)。
1.1 包檔案使用
# 普通使用 import test # test.func1() func1 函式執行了 # test.func2() func2 函式執行了 # 在 Python 一切皆物件 f1=getattr(test,'func1') f1() f2=getattr(test,'func2') f2() # 通過反射獲取函式物件,加上()就會執行。
1.2 類反射使用
class Foo:
def __init__(self):
self.name="啊哈"
self.age="啊哈哈"
obj=Foo()
# 使用反射
name=getattr(obj,'name')
print(name)
age=getattr(obj,'age')
print(age)
類物件反射:通過反射獲取自己已經例項化好的物件,並獲取對應的屬性。
2.setattr
setattr(obj,'name','好的') print(obj.name) # 新增 setattr(obj,'postion','北京') print(obj.postion)
通過本方法為物件新增或者修改屬性值。
3.delattr
delattr(obj,'name')
print(obj.name)
4.應用場景
補充:通過字串匯入對應的路徑與模組。
import importlib
# 將路徑傳入對應引數,並返回匯入函式。
m=importlib.import_module("communs.path.UserInfo")
4.1 載入對應的函式
載入業務類,類似於Django
的中介軟體。
import settings import importlib importlib.import_module("communs.db.utils") for item in settings.FUNC_LIST: path,func_name=item.rsplit('.',maxsplit=1) # print(path,func_name) m=importlib.import_module(path) func=getattr(m,func_name) func()
FUNC_LIST=[
'communs.db.utils.f1',
'communs.db.utils.f2',
'communs.db.utils.f3',
'communs.db.utils.f4',
]
settings.py
4.2 載入對應的類
for item in settings.CLASS_NAME:
path_str,cls_name=item.rsplit('.',maxsplit=1)
m=importlib.import_module(path_str)
cls=getattr(m,'AuthPerson')
cls("準備休息吧")#例項化物件。
# 如果例項化的類中存在引數的話,如果是迴圈建立多個物件的話,引數儘量保持相同
說明:以上兩種方式都具有非常好的擴充套件性。比較接近開放封閉原則。
5.列表的補充
li=[1,1,9,3,4,5,6]
print(li[2])
# 本質上是在執行__getitem__方法。
print(li.__getitem__(2))
# 通過反射獲取列表中的元素
method=getattr(li,'__getitem__')
res=method(3)
print(res)
繼續努力,終成大器!