反射

getattr(object,name,default=None) 
获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,可以在后面添加一对括号。

hasattr(object,name) 

其中name为字符串,判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False

setattr(object,name,value)

函数对应函数 getatt(),用于设置属性值,该属性必须存在

delattr(object,name)

删除一个属性值

 1 def bulk(self):
 2     print("%s你在干嘛呢" %self.name)
 3 
 4 
 5 class dog(object):
 6     def __init__(self,name):
 7         self.name = name
 8 
 9     def eat(self,food):
10         print("%s is eating..%s" %(self.name,food))
11 
12 
13 d = dog('Djj')
14 choice = input(">>>").strip()
15 
16 if hasattr(d,choice):  #判断对象有eat方法
17     func = getattr(d,choice) #获取eat方法,存在就打印出方法的内存地址
18     func('饺子')               #获取eat方法,后面加括号可以将这个方法运行
19 else:
20     setattr(d,choice,bulk)  #choice字符串属性不存在时,设置该属性为bulk,简单来说就是choice输入一个不存在的值,给对象d的属性赋值,若属性不存在,先创建再赋值
21     t = getattr(d,choice)
22     t(d)

其实上面的例子就是判断d这个对象里面有没有choice输入的属性,如果有就执行eat打印,如果没有,就执行下面的创建属性,由于你不知道用户输入的是什么变量,在这里不能将setattr里面的name写入固定值,这是就需要用t传入参数,然后再传入对象d的值,后返回bulk

下面有个说明的例子:

 1 class dog(object):
 2     jineng = '哈沙克'
 3     power = 'less'
 4     def __init__(self,name):
 5         self.name = name
 6     def tell(self):
 7         print("你的名字%s" %self.name)
 8 
 9 d = dog('随便啦')            #将类实例化对象
10 print(hasattr(d,'jineng'))  #判断对象里面是否有jineng这个属性,OK。返回默认值True,说明有这个属性
11 print(d.jineng)             #返回这个属性的值哈沙克
12 setattr(d,'power','Max')    #不管是否有power这个属性,先创建,然后赋值Max
13 print(d.power)              #返回默认值Max
14 delattr(d,'power')          #删除一个属性
15 print(d.power)
1 显示结果
2 >>>True
3 >>>哈沙克
4 >>>Max
5 >>>less

 

posted @ 2017-11-24 11:04  橙子味的萝卜  阅读(109)  评论(0编辑  收藏  举报