反射原理
反射的原理及示例
反射是根据字符串到对象中找到对应的变量或方法名,如果找到的话返回变量的值或方法的名字。
它有四个内置函数:hasattr(obj,name_str),getattr(obj,name_str),setattr(obj,name_str,value),delattr(obj,name_str)
代码示例如下:
class PersonInfo(object):
commity_data = 123
def __init__(self,name,age):
self.name = name
self.age = age
def weight(self):
print('%s weight is high'% self.name)
def happie(self):
print('happie de age is %s' % self.age)
def bulk(self):
print 'bulk %s'% self.name
if __name__ == '__main__':
user_input = raw_input('please input >>>:').strip()
obj = PersonInfo('goser',23)
if hasattr(obj,user_input):
res = getattr(obj,user_input)
res()
else:
setattr(obj,user_input,bulk)
func = getattr(obj,user_input)
func(obj)
上面的代码中是按照获取方法的示例,所有用res()后面加(),如果想获取对象的属性的话,就不应该在res后加()了,直接print(res)返回变量的值。
比如上面的代码运行后输入weight,那么输出的结果就为:goser weight is high
对于setattr()可以对对象添加一个属性或方法(这个方法为外部绑定的方法),例如上面代码中的外部bulk方法,就可以通过setattr()来绑定到对象中。
下面再补上删除的功能:、
user_input = raw_input('please input >>>:').strip()
obj = PersonInfo('goser',23)
if hasattr(obj,user_input):
delattr(obj,user_input)
print obj.name
else:
setattr(obj,user_input,bulk)
func = getattr(obj,user_input)
func(obj)
当程序运行时输入name,那么name属性就会被删除,接下来再打印name的话就会报属性错,
报错结果为:
AttributeError: 'PersonInfo' object has no attribute 'name'
浙公网安备 33010602011771号