面向对象之反射
2019-11-14 08:36 风e逸 阅读(88) 评论(0) 收藏 举报反射就是自省,是一种自查机制,有三个函数
hasattr(), getattr(), setattr()
定义一个类并进行实例化
1 class Test: 2 a = 1 3 b = 2 4 def __init__(self, name ,age ): 5 self.name = name 6 self.age = age 7 8 def method(self): 9 print('this is a method') 10 11 t1 = Test('alex', 18)
hasattr
hasattr(),里面有两个参数,第一个参数是 对象名, 第二个从参数是字符串。函数用来判断对象中是否存在字符串所对应的函数
1 print(hasattr(t1, 'a')) # 返回值 True 2 print(hasattr(t1, 'method')) # 返回值 True 3 print(hasattr(t1, 'metho')) # 返回值 False
getattr
getattr(),里面有三个参数,第三个参数默认设置。与hasattr一样,第一个参数是 对象名, 第二个从参数是字符串。
但getattr是用来获取字符串对应的函数内容的,如果有此函数,返回内容,如果没有,默认报错,如果设置第三个参数,则返回第三个参数
1 print(getattr(t1, 'a')) # 返回值为 1 2 # print(getattr(t1, 'c')) # 报错。AttributeError: 'Test' object has no attribute 'c' 3 print(getattr(t1, 'c', '没有此函数')) # 返回值为 没有此函数
setattr
setattr(x, 'y', v) #函数解释中显示 x.y = v ,如果y不存在与x中,则新增y,值为v,如果y存在于x中,则修改y的值为v。
1 setattr(t1, 'c', 555) 2 print(t1.c) 3 setattr(t1, '__init__.name', 6) 4 print(t1.__dict__)
反射的作用
反射的主要作用可以用来做可插拔式操作,通常用于两个程序或程序员工作交互中
例如,程序员A定义了某个类但还未定义类中的具体函数,此时程序员B接手了A的工作或者要调用A的类
1 # A: 2 class func: 3 def __init__(self, aaa): 4 self.aaa = aaa
B: 注意,B在另外的界面操作,且不知道A具体定义了哪些内容
1 # from fanshe import func 2 f1 = func(123) # 进行实例化测试 3 4 # 开始可插拔式操作 5 if hasattr(f1, 'put'): # 进行判断,B需要的函数,类中是否存在,如果存在,则正常运行 6 print('执行put函数,进行操作') 7 else: 8 '编写自己所需要的代码' 9 print('_____')
浙公网安备 33010602011771号