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)
继续努力,终成大器!