功能 可以实现 用一个字符串调用类中对应的实例的方法:
反射:
hasattr (obj,name_str),判断一个对象obj里是否有字符串name_str的方法
getattr(obj,name_srt),根据字符串去获取obj对象里的对应方法的内存地址
setattr(obj,变量字符串,值) 给类的实例对象obj 加一个 变量字符串的属性 值是第三个参数
delattr(obj,变量字符串) 删除变量字符串对应的obj对象的方法
class Dog(object):
def __init__(self,name):
self.name = name
def eat(self,food):
print("%s在吃"%self.name,food)
d = Dog("keji")
choice = input(">>>:").strip()
#想实现的功能 用字符串调用实例化的方法 eat
#d.choice 直接这么写是不可以的 因为后面的是字符串
#先判断有没有 这个方法
if hasattr(d,choice):# 判断类实例中有没有什么方法? 有返回True
delattr(d,choice) #判断是否有属性 如果有 删除 就这么用
func = getattr(d,choice)# 取相应字符串的属性 用字符串映射出了实例的一个方法
func("骨头")
else:
# setattr(d,choice,bulk) #x.y = V x是字符串 y是方法 V是值
# d.bulk(d) #动态的吧一个类外面的方法装配到了 类里面
setattr(d,choice,22) #动态的设置一个输入的属性
print(getattr(d,choice))#打印动态属性对应的值
这样就实现了用字符串 choice 调用 Dog类的 eat方法