此章涉及到的是反射机制
反射主要涉及到以下方法:
hasattr、getattr、setattr、delattr
首先说明他们的作用:
hasattr是用来判断在指定范围内是否存在指定内容的方法
getattr是用来从指定范围内取出指定内容的方法
setattr是用来设置指定范围内指定内容的值的方法
delattr是用来从指定范围内删除指定内容的方法
将这四者串起来的话,首先要从hasattr说起。
比如:
class Person(): def __init__(self,name,age,gender): self.name=name self.age=age self.gender=gender def talk(self): print("%s is talking"%self.name) d=Person("liu",26,"male") select=input("请输入要执行的函数:") if hasattr(d,select)==True: print("此类存在") else: print("此类不存在")
输入talk,则会返回此类存在。
输入其他值,则会返回此类不存在
用了hasattr判断完对象是否存在之后,我们就可以使用getattr取出该对象,如果该对象是个方法的话,那么就可以直接运行此方法,如果该对象是个参数的话,那么我们就可以直接得到该值。
class Person(): def __init__(self,name,age,gender): self.name=name self.age=age self.gender=gender def talk(self): print("%s is talking"%self.name) d=Person("liu",26,"male") select=input("请输入要执行的函数:") if hasattr(d,select)==True: getattr(d,select)() else: print("此类不存在")
输出的结果为:
在用getattr找到指定内容后,可能还会涉及到更改其值。如果真的需要更改值,那么就需要到了setattr这个函数。
class Person(): def __init__(self,name,age,gender): self.name=name self.age=age self.gender=gender def talk(self): print("%s is talking"%self.name) d=Person("liu",26,"male") d.talk() select=input("请输入要执行的函数:") if hasattr(d,select)==True: setattr(d,"name","zhao") getattr(d,select)() else: print("此类不存在")
运行该函数可以得到以下结果:
最后如果想要删除某些内容,可以调用delattr来进行相关内容的删除。
class Person(): def __init__(self,name,age,gender): self.name=name self.age=age self.gender=gender def talk(self): print("%s is talking"%self.name) d=Person("liu",26,"male") d.talk() # delattr(d,"age") d.talk() print(d.age) # delattr(d,"name") d.talk()
按照以上代码运行,最终结果为:
若将注释掉的代码回复,则结果变为:
可以对其进行异常处理:
d=Person("liu",26,"male") d.talk() delattr(d,"age") d.talk() if hasattr(d,"age")==True: print(d.age) else: print("age被删除") delattr(d,"name") if hasattr(d,"name"): d.talk() else: print("name被删除")
结果就不会涉及报错了: