一、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}
四个可以实现自省的函数:hasattr(obj, name);getattr(obj, name);setattr(x, y, v);delattr(x, y)

相关文章: