类的特殊方法 反射 getattr hasattr setattr delattr

反射能够将字符串映射到类的方法或者属性的内存地址,达到通过字符串访问类属性 方法的作用,主要有四种方法

 1 class Human(object):
 2     def __init__(self, name, age, hobby):
 3         self.name = name
 4         self.age = age
 5         self.hobby = hobby
 6     def info(self):
 7         print("my name is %s, age ia %s"%(self.name, self.age))
 8 
 9 def get_hobby(self): #定义一个函数,后面使用setattr方法将其装配进man1这个对象,此时函数与类以及对象无任何关系
10     print("my hobby is %s"%self.hobby)
11 
12 man1 = Human("张三", 25, "running") #初始化一个对象
13 fun = input("please inpute the function you want:").strip()
14 if hasattr(man1, fun): #hasattr有两个参数,第一个为对象名,第二个为字符串,判断对象是否有字符串名的属性或者方法,有则返回True,否则返回False
15     getattr(man1, fun)() #getattr参数与hasattr一致,如果字符串对应对象的属性则直接返回属性内容,如果是方法则返回方法的内存地址,内存地址加()就可以获取执行结果
16 else:#当输出其它不属于类本身的方法  属性时就将get_hobby函数装配进对象并调用
17     setattr(man1, fun, get_hobby) #将get_hobby函数装配进man1对象,并且后续使用man1.fun()调用get_hobby,类似于man1.fun = get_hobby
18     getattr(man1, fun)(man1) # 使用getattr调用装配的get_hobby方法,由于方法是后装配的实例调用需要手动传入self即对象本身
19     delattr(man1, fun) #删除man1对象对应fun字符串的方法或者属性,输入非info则上一行正常执行下一行会报错无此方法
20     getattr(man1, fun)(man1)

 

上一篇:牛客练习赛 4 A-Laptop (线段树,思维)


下一篇:尝试从github安装R fst软件包的开发版时出现“/ bin / sh:XX:command not found”错误