- # 反射
- '''
- 反射的定义:主要是应用于类的对象上,在运行时,将对象中的属性和方法反射出来。
- 使用场景:可以动态的向对象中添加属性和方法。也可以动态的调用对象中的方法或者属性。
- 反射的常用方法:
- 1.hasaattr(obj,str)
- 判断输入的str字符串在对象obj中是否存在(属性或方法),存在返回True,否则返回False
- 2.getattr(obj,str)
- 将按照输入的str字符串在对象obj中查找。如找到同名属性,则返回该属性;如找到同名方法,则返回方法的引用,
- 想要调用此方法得使用 getattr(obj,str)()进行调用。
- 如果未能找到同名的属性或者方法,则抛出异常:AttributeError。
- 3.setattr(obj,name,value)
- name为属性名或者方法名,value为属性值或者方法的引用
- 1) 动态添加属性。如上
- 2)动态添加方法。首先定义一个方法。再使用setattr(对象名,想要定义的方法名,所定义方法的方法名)
- 4.delattr(obj,str)
- 将你输入的字符串str在对象obj中查找,如找到同名属性或者方法就进行删除
- '''
-
-
- class Dog(object):
- def __init__(self, name):
- self.name = name
-
- def eat(self):
- print(f"{self.name}正在吃东西...")
-
- dog = Dog("二哈")
-
- # hasaattr的使用
- # str = input("请输入你要判断的属性名或者方法名:")
- # # print(hasattr(dog, str)) # 输入name --> 返回True,对象dog中确实存在name属性
- # print(hasattr(dog, str)) # 输入age --> 返回False,对象dog中不存在age属性或者age方法
-
- # # getattr的使用
- # str = input("请输入你想要查找的属性名或者方法名:")
- # print(getattr(dog, str)) # 输入name --> 返回二哈,对象dog中name的属性确实为二哈
- # print(getattr(dog, str)) # 输入age --> 抛出异常 AttributeError: 'Dog' object has no attribute 'age'
-
- # # setattr的使用
- # name = input("请输入想要添加的属性名:")
- # value = input("请输入想要添加的属性值:")
- # # 添加属性
- # setattr(dog, name , value) # name:age,value:5
- # print(getattr(dog, name)) # 输出结果为:5,说明添加属性age成功。
- # # 添加方法
- # name = input("请输入想要添加的属性名:")
- # def run():
- # print("二哈正在奔跑...")
- # setattr(dog, name, run) # 此时的run为函数run的引用(相当于指针指向run函数)
- # getattr(dog, name)() # 方法的调用
-
- # delattr的使用
- str = input("请输入想要删除的属性名或者方法名:")
- print(getattr(dog, str)) # 输入str为name,返回二哈
- delattr(dog, str) # 删除name属性
- print(getattr(dog, str)) # 抛出异常 AttributeError: 'Dog' object has no attribute 'name'