面向对象进阶
一、反射
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__)