Python面向对象-反射

python面向对象-反射

在python的面向对象中,与用户交互的主要方式就是利用反射来判断用户输入的指令是否存在和可执行

  • 反射的定义
    在python中反射主要是应用于类的对象上,在运行时,将对象的属性和方法发射出来

  • 使用场景
    可以动态的向对象中添加属性和方法,同样可以动态的调用对象中的方法或者属性

  • 反射的四中常用方法
    1. hasattr(obj,str)
    判断输入的stt字符串在对象obj中是否存在(属性或方法)存在返回True,不存在返回False
    2. getattr(obj,str)
    将按照输入的str字符串在对象obj中查找,如找到同名属性,则返回该属性,如找到同名方法,则返回改方法的引用,
    想要调用此方法需要使用 getattr(obj,str)() 进行调用
    如果未找到同名的属性或者方法,则会抛出异常AttributeError,一般于hasattr配合使用
    3. setattr(obj,name,value)
    name为属性名或者方法名,value为属性值或者方法的引用
    1)动态添加属性 setattr(obj, name, value) 无则添加,有则修改
    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('二哈')
    
    	# hasattr()的使用
    	str = input('请输入你需要判断的属性名或者方法名:')
    	print(hasattr(dog, eat))  # 返回True ,对象中确实有eat这个方法
    	print(hasattr(dog, age))  # 返回false,对象中无这个方法和属性
    	
    	# getattr()的使用
    	str = input('请输入你需要判断的属性名或者方法名:')
    	print(getattr(dog, str))  # 输入name,返回二哈,dog对象中有这个属性,输入age报错AttributeError 对象dog中没有这个属性
    	print(getattr(dog, str))  # 输入eat,返回<bound method Dog.eat of <__main__.Dog object at 0x104e2cfd0>> ,对象中有这个绑定方法,如果没有同报错
    	
    	# setattr()的使用
    	name = input('请输入想要添加的属性名:')  # 第一次输入age ,第二次输入age
    	value = input('请输入想要添加的属性值:')  # 第一次输入 18 ,第二次输入19
    	setattr(dog, name, value)
    	print(getattr(dog, name))  # 第一次对象中没有age这个属性则直接添加age=18, 第二次输入age=19 则直接修改属性age=19
    	# 添加方法
    	name = input('请输入想添加的方法:')
    	def run():
    		print('二哈正在奔跑。。。')  # 先定义一个方法
    
    	setattr(dog, name, run)  # 此时的run为函数run的引用,函数的作为变量名的传值方式,(相当于指针指向run函数)
    	getattr(dog, name)()  # 使用getattr加() 的方式调用函数,得到二哈正在奔跑。。。
    	
    	# delattr()的使用
    	str = input('请输入想要删除的属性名或方法名:')
    	print(getattr(dog,str))  # 获取dog对象中的name属性,值为二哈
    	delattr(dog, str)  # 删除dog对象中的name属性
    	print(getattr(dog,str))  # 再次获取obj对象中的name属性,由于已经被删除,则抛出异常AttributeError
    	```
    
posted @ 2022-12-01 18:32  樵夫-  阅读(86)  评论(0)    收藏  举报