面向对象进阶
一、反射
1、定义:
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
2、python中的反射
通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
3、可以实现自省的函数:hasattr、getattr、setattr、delattr
①举例
1 class Foo: 2 f = ‘类的静态变量‘ 3 def __init__(self,name,age): 4 self.name=name 5 self.age=age 6 7 def say_hi(self): 8 print(‘hi,%s‘%self.name) 9 10 obj=Foo(‘egon‘,73) 11 12 #检测是否含有某属性 13 print(hasattr(obj,‘name‘)) 14 print(hasattr(obj,‘say_hi‘)) 15 16 #获取属性 17 n=getattr(obj,‘name‘) 18 print(n) 19 func=getattr(obj,‘say_hi‘) 20 func() 21 22 print(getattr(obj,‘aaaaaaaa‘,‘不存在啊‘)) #报错 23 24 #设置属性 25 setattr(obj,‘sb‘,True) 26 setattr(obj,‘show_name‘,lambda self:self.name+‘sb‘) 27 print(obj.__dict__) 28 print(obj.show_name(obj)) 29 30 #删除属性 31 delattr(obj,‘age‘) 32 delattr(obj,‘show_name‘) 33 delattr(obj,‘show_name111‘)#不存在,则报错 34 35 print(obj.__dict__)