欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 16:50:44
...
# ### 与类相关的魔术属性
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("大哥,没有")