码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-01-30 21:19:42      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:lease   定义   pre   info   四种方法   you   输出   方法   应对   

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

 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)

 

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

标签:lease   定义   pre   info   四种方法   you   输出   方法   应对   

原文地址:https://www.cnblogs.com/flags-blog/p/12243455.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!