Python反射

反射

  • 一、hasattr
  • 二、getattr
  • 三、setattr
  • 四、delattr

针对于类对象或者模块
概念:通过字符串去操作类对象或者模块当中的成员(属性或者方法)

一、hasattr

检测对象/类是否有指定的成员
语法:hasattr(类/对象,“成员”)

class Man():
	pass
class Woman():
	pass
class Son(Man,Woman):
	def hobby(self):
		print("打篮球,玩电脑,游泳")
	def eat(self):
		print("羊肉串,大腰子,烤鱼")
obj=Son()
res=hasattr(Son,"hobby")
print(res)

运行结果:
Python反射_第1张图片

二、getattr

获取对象/类成员中的值

class Man():
	pass
class Woman():
	pass
class Son(Man,Woman):
	def hobby(self):
		print("打篮球,玩电脑,游泳")
	def eat(self):
		print("羊肉串,大腰子,烤鱼")
obj=Son()
#通过类反射出来的方法是一个绑定方法
func1=getattr(Son,"hobby")
func1(1)
#通过对象反射出来的方法是一个普通方法
func2=getattr(obj,"eat")
func2()
#反射成员不存在时,可以设置一个默认值防止报错
res=getattr(obj,"drink","该成员不存在")
print(res)

运行结果:
Python反射_第2张图片

综合案例:
获取当前文件中的自定义成员:

import sys
def func1():
	print("我是func1函数")
def func2():
	print("我是func2函数")
def func3():
	print("我是func3函数")
while True:
	selfmodules=sys.modules["__main__"]
	message=input("请输入你要反射的方法:")
	if hasattr(selfmodules,message):
		func=getattr(selfmodules,message)
		func()
	else:
		print("方法不存在")

运行结果:
Python反射_第3张图片

三、setattr

设置对象/类成员的值

class Man():
	pass
class Woman():
	pass
class Son(Man,Woman):
	def hobby(self):
		print("打篮球,玩电脑,游泳")
	def eat(self):
		print("羊肉串,大腰子,烤鱼")
obj=Son()
setattr(obj,"eye","黑色")
print(obj.eye)

运行结果:
Python反射_第4张图片

四、delattr

删除对象/类成员的值

class Man():
	pass
class Woman():
	pass
class Son(Man,Woman):
	def hobby(self):
		print("打篮球,玩电脑,游泳")
	def eat(self):
		print("羊肉串,大腰子,烤鱼")
obj=Son()
setattr(obj,"eye","黑色")
delattr(obj,"eye")
print(obj.eye)

运行结果:
Python反射_第5张图片

如上,成功删除成员值

你可能感兴趣的:(python,python)