1. 程式人生 > 其它 >Python 反射

Python 反射

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)

繼續努力,終成大器!