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]])
posted @ 2020-04-15 22:20  the3times  阅读(111)  评论(0编辑  收藏  举报