一、isinstance(obj, cls) and issubclass(sub, super)
1. isinstance(obj, cls),检查obj是否是类cls的对象
1 class A: 2 pass 3 4 obj = A() 5 print(isinstance(obj, A)) 6 7 #运行结果 8 #True
2. issubclass(sub, super),检查sub类是否是super类的派生类(子类)
1 class A: 2 pass 3 4 class B(A): 5 pass 6 7 print(issubclass(B, A)) 8 9 #运行结果 10 #True
二、反射
1. 什么是反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
2. python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)。
1 class People: 2 country = 'China' 3 def __init__(self, name, age): 4 self.name = name 5 self.age = age 6 7 def info(self): 8 print('%s is %d years old' % (self.name, self.age)) 9 10 p = People('jack', 18) 11 12 #hasattr(obj, name),检查属性 13 print(hasattr(p, 'info')) #检查对象p是否有‘info’属性,结果True 14 print(hasattr(p, 'name')) #检查对象p是否有‘name’属性,结果True 15 16 #getattr(obj, name)获取属性 17 print(getattr(p, 'name')) #获得对象p的‘name’属性,结果:返回p.name的值,即jack 18 print(getattr(p, 'info')) #获得对象p的‘info’属性,结果:返回p.info的值, 19 # 即绑定方法info的内存地址:<bound method People.info of <__main__.People object at 0x000001B64317ABE0>> 20 getattr(p, 'info')() #由于getattr返回的是对象方法属性的内存地址,加()就可以调用,结果:jack is 18 years old 21 22 #setattr(x, y, v)设置属性 23 setattr(p, 'age', 21) #修改对象p的‘age’属性,结果:p.age的值变为21 24 setattr(p, 'sex', 'male') #新增对象p的‘sex’属性,结果:p.sex的值为male 25 print(p.__dict__) #查看对象p的数据属性,结果:{'name': 'jack', 'age': 21, 'sex': 'male'} 26 27 #delattr(x, y)删除属性 28 delattr(p, 'sex') #删除对象p的‘sex’属性 29 print(p.__dict__) #结果:{'name': 'jack', 'age': 21}