Skip to content

Latest commit

 

History

History
51 lines (36 loc) · 1.55 KB

5.Reflect.md

File metadata and controls

51 lines (36 loc) · 1.55 KB

python中的反射机制

所谓反射(reflect),简言之就是用模块和函数的名称(字符串)去动态的调用模块、实例化对象和调用相关函数。

在写python代码时,我们经常使用这样的语句。

import some_module as m
m.some_func()

这样的写法需要预先知道要import的模块或者函数名称。但是有些情况下,我们希望根据动态接受的输入字符串,来动态调用这个模块。比如上面的例子,我们get到一个str,它的值为

name = "some_module"

这时候,不能直接用import name来load模块,因为name是一个变量,而我们要的是变量的值。此时就需要用到反射机制。一段反射机制的例程:

module_name = "some_module"
func_name = "func"
M = __import__(module_name)
f = getattr(M, func_name, None)

# 核心就是两个函数:__import__和getattr
# 上面这段代码等效于:
import some_module
f = some_module.func()

反射是一种通过字符串形成操作的方式,相当有在根据指令动态写程序。因此更加灵活。

反射还可以用来对class进行实例化,并且对成员函数、变量进行操作。比如:

class A:
    def func1(self):
        print("func 1")
    def func2(self):
        print("func 2")
        
a = A()
hs1 = hasattr(a, 'func1') # 判断class A中是否有func1这个函数/变量
f = getattr(a, 'func1') # 上面已介绍过了
setattr(a, 'new_attr', 10) # 修改或新增成员变量
delattr(a, 'func1') # 删除某个成员变量/函数