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()

# 通过反射获取函数对象,加上()就会执行。

image-20220120211512356

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)

类对象反射:通过反射获取自己已经实例化好的对象,并获取对应的属性。

image-20220120212138508

2.setattr

setattr(obj,'name','好的')
print(obj.name)
# 添加
setattr(obj,'postion','北京')
print(obj.postion)

通过本方法为对象添加或者修改属性值。

image-20220120213720738

3.delattr

delattr(obj,'name')
print(obj.name)

image-20220120214109930

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

image-20220120220817358

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("准备休息吧")#实例化对象。
    # 如果实例化的类中存在参数的话,如果是循环创建多个对象的话,参数尽量保持相同

image-20220120221957854

说明:以上两种方式都具有非常好的扩展性。比较接近开放封闭原则

5.列表的补充

image-20220120223118914

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)

image-20220120223143242

继续努力,终成大器!

posted @ 2022-01-20 22:33  紫青宝剑  阅读(71)  评论(0编辑  收藏  举报