反射:根据字符串来获取相应的内存对象(相应对象的内存地址)
关于反射的几个函数:hasattr(), getattr(), setattr(), delattr()
1. hasattr(object,name)
判断一个对象里是否有name属性或者方法,如果有返回Ture,否则返回False
2.getattr(object,name[,default])
获取对象object的属性或方法,若存在则打印出来,若不存在打印默认值
(注:若返回对象是方法,则返回的是方法的内存地址)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
import sysclass Animal(object): def __init__(self,name): self.name = name def Dog(self): print('%s 吃粑粑。。' % self.name) def Cat(self): print('%s 喵喵叫。。' % self.name) def Print_A(self): self.Dog() self.Cat()if __name__=='__main__': D = Animal('狗类') C = Animal('猫类')# D.Dog()# C.Cat() if hasattr(D, sys.argv[1]): # 判断D实例中,是否有Dog属性 func = getattr(D, sys.argv[1]) # 获取D.Dog方法的内存地址 func() else: print('Animal中没有这个类。。')
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
D:\1.pycharm>dir 驱动器 D 中的卷是 软件 卷的序列号是 0002-A33B D:\1.pycharm 的目录2018/10/26 15:13.2018/10/26 15:13 ..2018/10/26 16:19 .idea2018/09/07 08:18 day 2018_09_062018/08/13 16:37 day12018/09/09 18:35 day22018/09/05 10:05 day2018_09_042018/09/07 19:40 day2018_09_072018/09/09 09:47 day2018_09_082018/09/18 21:01 day2018_09_102018/09/13 10:27 day2018_09_122018/09/13 10:55 day2018_09_132018/09/14 18:18 day2018_09_142018/09/17 17:56 day2018_09_162018/09/18 16:56 day2018_09_172018/09/18 21:20 day2018_09_182018/09/21 17:41 day2018_09_192018/09/22 15:10 day2018_09_212018/09/24 21:16 day2018_09_222018/09/27 18:16 day2018_09_252018/10/13 17:41 day2018_09_262018/10/19 18:13 day2018_10_142018/10/25 16:57 day2018_10_182018/10/25 21:00 day2018_10_252018/10/26 16:18 day2018_10_262018/09/07 16:44 day2018_9_52018/08/16 16:59 day32018/09/03 20:48 day42018/09/03 20:53 test 0 个文件 0 字节 29 个目录 67,621,523,456 可用字节D:\1.pycharm>cd day2018_10_26D:\1.pycharm\day2018_10_26>dir 驱动器 D 中的卷是 软件 卷的序列号是 0002-A33B D:\1.pycharm\day2018_10_26 的目录2018/10/26 16:18 .2018/10/26 16:18 ..2018/10/26 15:13 0 __init__.py2018/10/26 16:18 773 反射.py 2 个文件 773 字节 2 个目录 67,621,457,920 可用字节D:\1.pycharm\day2018_10_26>python 反射.py habitAnimal中没有这个类。。D:\1.pycharm\day2018_10_26>python 反射.py Dog狗类 吃粑粑。。
注:
|
3.setattr(object,name,values)
给对象的属性赋值,若属性不存在,先创建再赋值
(注:可用于给实例绑定方法)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
import sysclass Animal(object): Rabbit='兔子吃草。。略略略' def __init__(self,name): self.name = name def Dog(self): print('%s 吃粑粑。。' % self.name) def Cat(self): print('%s 喵喵叫。。' % self.name) def Print_A(self): self.Dog() self.Cat()def Tortoise(name): print('%s 吃肉肉。。' % name)def Tortoise1(self,name): # 这样就可以调用Animal里的属性或者方法了 print('%s 吃肉肉。。' % name,self.Rabbit)if __name__=='__main__': D = Animal('狗类') C = Animal('猫类')# D.Dog()# C.Cat() setattr(D, 'T', Tortoise) # D为实例,‘T’为给Dog1绑定到D的名字,Tortoise为被绑定的方法名 D.T('龟龟类') # 把方法绑定在实例上的 # C.T('龟龟类') 这里会调用失败,说明只是把Tortoise方法绑定在 D 实例上 setattr(C, 'T1', Tortoise1) C.T1(C,'龟龟类') # 这里需要把如果Tortoise1里想要调用Animal里的东西需要把Animal或实例化了的C或D任意一个传进去
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
龟龟类 吃肉肉。。龟龟类 吃肉肉。。 兔子吃草。。略略略
4.delattr(object,'name')
删除object对象的方法或属性
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
import sysclass Animal(object): Rabbit='兔子吃草。。略略略' def __init__(self,name): self.name = name def Dog(self): print('%s 吃粑粑。。' % self.name) def Cat(self): print('%s 喵喵叫。。' % self.name) def Print_A(self): self.Dog() self.Cat()def Tortoise(name): print('%s 吃肉肉。。' % name)if __name__=='__main__': D = Animal('狗类') C = Animal('猫类')# D.Dog()# C.Cat() setattr(D, 'T', Tortoise) # D为实例,‘T’为给Dog1绑定到D的名字,Tortoise为被绑定的方法名 D.T('龟龟类') # 把方法绑定在实例上的 # C.T('龟龟类') 这里会调用失败,说明只是把Tortoise方法绑定在 D 实例上 # delattr(D,'Dog') # D 是实例,无法删除Animal类里的方法 # delattr(Animal,'Dog') # 但是可以类删除里面的方法 # D.Dog() # AttributeError: 'Animal' object has no attribute 'Dog' delattr(D, 'T') # 可以删除实例绑定的方法'T' D.T('龟龟类')