python反射
反射
反射指的是在程序运行过程中可以"动态"获取对象的信息。比如判断用户输入的一个字符串是不是一个对象的属性。通过反射可以避免程序使用较为繁琐的if-elif-else
判断,使得代码结构简洁清晰。
class Ftp:
def get(self):
pass
def set(self):
pass
ftp = Ftp()
cmd = input('请输入指令:').strip()
if cmd == 'get':
ftp.get()
elif cmd == 'set':
ftp.set()
else:
print('指令不存在')
四个内置函数
hasattr(obj, 'x') # 判断对象是否有一个属性,返回布尔值
getattr(object, name, default=None) # 获取一个对象的name属性,如果name属性不存在的返回None
setattr(x, 'y', 'v') # 更新对象y属性的值, 等价于 x.y = 'v',当y不存在的新增
delattr(x, 'y') # 删除对象的一个属性, 等价于 del x.y 属性y不存在则报错
应用
class Ftp:
def get(self):
pass
def set(self):
pass
ftp = Ftp()
cmd = input('请输入指令:').strip()
if hasattr(ftp, cmd):
getattr(ftp, cmd)()
else:
print('指令不存在')
类也是对象,反射类下面定义的方法。
class Foo(object):
staticField = "old boy"
def __init__(self):
self.name = 'wupeiqi'
def func(self):
return 'func'
@staticmethod
def bar():
return 'bar'
print getattr(Foo, 'staticField')
print getattr(Foo, 'func')
print getattr(Foo, 'bar')
反射当前模块成员
import sys
def s1():
print 's1'
def s2():
print 's2'
this_module = sys.modules[__name__]
hasattr(this_module, 's1')
getattr(this_module, 's2')
利用反射,判断引入的模块是否具有某个方法
import module_test as obj
print(hasattr(obj, 'test'))
补充:反射机制底层原理
1、先通过dir:查看出一个对象下可以.出哪些属性来
print(dir(obj))
2、可以通过字符串反射到真正的属性上,得到属性值
print(obj.__dict__[dir(obj)[-2]])