反射 | hasattr() | getattr() | setattr() | delattr() 的使用方法

# ### 与类相关的魔术属性
class Human():
	pass

class Man():
	pass
	
class Woman():
	pass
	
class Children(Man,Woman):
	'''
	类的功能: 描述一个小孩
	类的成员属性:eye
	类的成员方法:sleep __beat_doudou
	'''
	eye = "蓝色眼睛"
	# 普通方法
	def eat():
		print("小孩喜欢吃东西")
		
	# 绑定方法
	def sleep(self):
		print("小孩喜欢睡觉,一天睡20个小时候")

	def drink(self):
		print("小孩喜欢喝水,喝水尿")
		
	def cry(self,func):
		res = func.__name__
		print(res,type(res))
		
	# 私有绑定方法
	def __beat_doudou(self):
		print("小孩喜欢打豆豆")


# __dict__ 获取对象或类的内部成员结构
obj = Children()
res = obj.__dict__
print(res)
print(Children.__dict__)

# __doc__  获取对象或类的内部文档
res = Children.__doc__
print(res)

# __name__ 获取类名函数名
def myfunc():
	print("我是函数")
obj.cry(myfunc)	

# __class__ 获取当前对象所属的类
res = obj.__class__
print(res)

# __bases__ 获取一个类直接继承的所有父类,返回元组
res = Children.__bases__
print(res)


# ### 反射
# 概念:通过字符串去操作类对象 或者 模块中的属性方法

# (1)hasattr() 检测对象/类是否有指定的成员 [以是否能够调用为基准]
res = hasattr(obj,"eye")
print(res)
res = hasattr(Children,"eat")
print(res)

# (2)getattr() 获取对象/类成员的值
res = getattr(obj,"eye")
print(res)
res = getattr(obj,"sleep")
print(res) # 它返回的是一个绑定方法
res()
res = getattr(Children,"eat")
print(res)
res()
res = getattr(Children,"sleep")
print(res) # 它不是一个绑定方法
res(123)

# getattr 第三个参数可选,如果获取不到这个值,可以添加默认提示.预防报错
res = getattr(obj,"abc","对不起这个真没有")
print(res)


# strvar = input("请输入您要调用的函数")
# if hasattr(obj,strvar):
	# res = getattr(obj,strvar)
	# res()


# (3)setattr() 设置对象/类成员的值
setattr(obj,"hair","屎黄色")
print(obj.hair)
setattr(Children,"skin","绿色")
print(Children.skin)


# (4)delattr() 删除对象/类成员的值 
delattr(obj,"hair")
# print(obj.hair)
delattr(Children,"skin")
# print(Children.skin)

# (2)模块的反射
# sys.modules 返回一个系统字典,字典的键是加载的所有模块
import sys
res = sys.modules
print(res)
print(__name__) #__main__
mymodule = sys.modules[__name__]
print(mymodule) # 模块对象

def func1():
	print("这是func1方法")
def func2():
	print("这是func2方法")
def func3():
	print("这是func3方法")

# 用户给我字符串,我反射对应的方法调用
while True:
	strvar  = input("请输入您要调用的方法")
	
	if hasattr(mymodule,strvar):
		_func_ = getattr(mymodule,strvar)
		_func_()
	else:
		print("大哥,没有")

  

原文地址:https://www.cnblogs.com/huangjiangyong/p/10946983.html