反射原理

反射的原理及示例

反射是根据字符串到对象中找到对应的变量或方法名,如果找到的话返回变量的值或方法的名字。

它有四个内置函数: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'

 

posted @ 2017-06-30 21:35  goser  阅读(181)  评论(0)    收藏  举报