python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)
class Penson: soul = "a" conntry = "b" def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def __getattr__(self, item): print("get") def __setattr__(self, key, value): print("set") def __delattr__(self, item): print("delattr") def __del__(self): print("del") @staticmethod def fn(self): print("fn") @classmethod def func(cls): print(cls.soul)
对象中使用getattr,hasattr查询非类中的属性会触发类中的__getattr__方法,当__getattr__不报错时,hasattr返回True.使用getattr,hasattr查询类中属性方法时(方法都属于类的),则不会触发类中的__getattr__方法,调用的是object中的方法.
对象中使用setattr和delattr分别触发__setattr__和__delattr__方法.
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys def s1(): print 's1' def s2(): print 's2' this_module = sys.modules[__name__] hasattr(this_module, 's1') getattr(this_module, 's2') 反射当前模块成员
导入其他模块,利用反射查找该模块是否存在某个方法
#!/usr/bin/env python # -*- coding:utf-8 -*- def test(): print('from the test')
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 程序目录: module_test.py index.py 当前文件: index.py """ import module_test as obj #obj.test() print(hasattr(obj,'test')) getattr(obj,'test')()