# ### 与类相关的魔术属性 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("大哥,没有")