反射
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