代码改变世界

面向对象之反射

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('_____')