python-魔法属性和反射
python魔法属性和反射
#!/usr/bin/python3 # coding:utf-8 # Auther:AlphaPanda # Description:与类相关的魔法属性 # Version:1 # Date:Wed Dec 4 02:22:28 EST 2019 class Man(): pass class Woman(): pass class Children(Man,Woman): """ 成员属性: skin,hair 成员方法: eat,drink,__sleep """ skin = "黑皮肤" hair = "黄头发" # 普通无参方法 def eat(): print("小孩会吃糖果") # 绑定方法: def drink(self): print("小孩会吃奶奶") # 大笑 def laugh(self,func): print(func) # 获取函数的名字 print(func.__name__) print("小孩会大笑") # 私有方法 def __sleep(self): print("小孩喜欢睡觉") # __dict__ 获取对象或类的内部成员结构 obj = Children() print(obj.__dict__) print(Children.__dict__) # __doc__ 获取对象或者类的内部文档 print(obj.__doc__) print(Children.__doc__) # __name__ 获取类名函数名 def ceshi(): print("我是测试函数") obj.laugh(ceshi) # __class__ 获取当前对象所属的类 cls = obj.__class__ print(cls.hair) # __bases__ 获取一个类直接继承的所有父类,返回元组 tup = Children.__bases__ print(tup) ### 反射 :通过字符串去操作类对象,或者模块中的属性方法 # 类的反射 # 1 hasattr() 检测对象/类中是否有指定成员 # 对象 res = hasattr(obj,"skin") # 属性 print(res) res = hasattr(obj,"drink") # 方法 print(res) # 类 res = hasattr(Children,"eat") print(res) # 2 getaddr() 获取对象/类成员的值 # 对象 res = getattr(obj,"hair") # 属性 print(res) res = getattr(obj,"hair123","第三个参数是默认值,如果该成员不存在,默认返回该值") print(res) # 类: res = getattr(Children,"drink") print(res) # 反射对象当中的方法 func1 = getattr(obj,"drink") print(func1) # 反射的是绑定到对象的方法,对象系统会自动传递 func1() # 反射类当中的方法 func2 = getattr(Children,"drink") print(func2) func2(2) """ func = input("请输入您要反射的行数:") if hasattr(Children,func): func_new = getattr(Children,func) func_new() else: print("不存在该方法") """ # 3 setattr()设置对象/类成员的值 # 对象 setattr(obj,"name","wangwen") print(obj.name) # 类: setattr(Children,"wc",lambda : print("小孩会尿尿")) print(Children.__dict__) Children.wc() # 4 delattr() 删除对象/类成员的值 # 对象 print(obj.__dict__) delattr(obj,"name") print(obj.__dict__) # (2) 模块的反射 """ 包:文件夹 模块:文件 """ def func1(): print("我是func1方法") def func2(): print("我是func2方法") def func3(): print("我是func3方法") def func4(): print("我是func4方法") # sys.modules 返回一个字典,字典的键是加载的所有模块 import sys print(sys.modules) # 获取当前模块得对象,通过这个对象可以进行反射 __main__这个键对应的是本模块对象 mymodule = sys.modules["__main__"] print(mymodule) # 小案例:通过字符串操作了该模块中相应的方法 while True: strvar = input("请输入你要反射的方法:") if hasattr(mymodule,strvar): func = getattr(mymodule,strvar) func() else: print("没有改函数")
念念不忘,必有回响。