#反射 : 是用字符串类型的名字 去操作 变量
# 反射对象中的属性和方法 # hasattr getattr setattr delattr
class Tech():
dic = {"学生信息":'show_student',"老师信息":'show_teacher'}
def show_teacher(self):
print("显示老师")
def show_student(self):
print("显示学生")
@classmethod
def func(self):
print("OKKKK")
print(Tech.dic) #{'学生信息': 'show_student', '老师信息': 'show_teacher'}
print("======")
jack = Tech()
print(jack.dic) #{'学生信息': 'show_student', '老师信息': 'show_teacher'}
for k in jack.dic:
print(k)
print("++++++")
'''
getattr()获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,
可以在后面添加一对括号。
'''
# getattr() 函数用于返回一个对象属性值
ret1 = getattr(Tech,"dic") #得到的类.属性名 类也是一个对象 #获取dic属性,存在就打印出来。
print(ret1) #{'学生信息': 'show_student', '老师信息': 'show_teacher'}
ret2 = getattr(Tech,"func") #得到的类.方法名, #获取func方法,存在就打印出方法的内存地址。
print(ret2) #<bound method Tech.func of <class '__main__.Tech'>>
print("--------------------")
#getattr(Tech,"func")() #获取func方法,后面加括号可以将这个方法运行。
ret2() #OKKKK #获取func方法,后面加括号可以将这个方法运行。
ret3 = getattr(jack,"show_teacher") #对象,方法名
ret3() #显示老师
ret4 = getattr("aaa", "age","18") #若属性不存在,返回一个默认值。
print(ret4) #18
if getattr(Tech,"dic"):
print(getattr(Tech,"dic"))
key = input("输入key的名称:")
print(Tech.dic[key])
#检测是否有某属性或方法
if hasattr(jack,Tech.dic[key]):
func = getattr(jack,Tech.dic[key]) #得到字典value的值,
func() #获取func方法,后面加括号可以将这个方法运行。
# hasattr(object, name)
# 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。
# 需要注意的是name要用括号括起来
ret5 = hasattr(jack, "name") #判断对象有name属性
print(ret5) #False
ret5 = hasattr(jack, "func") #判断对象有func属性
print(ret5) #True
#设置属性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))
#删除属性
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,则报错
print(obj.__dict__)