1、issubclass(a,b) ----> 判断a是否是b的子类.
isinstance(a,b) ----> 判断a这个对象是否是b类型的(可以向上判断, 即考虑继承关系往父类判断)
type(a) ----> 获取到a对象的类型, type是不考虑继承关系的.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Animal: 2 pass 3 class Cat(Animal): 4 pass 5 class LanCat(Cat): 6 pass 7 8 c = Cat() 9 l = LanCat() 10 print(isinstance(Cat(),Animal)) # True 判断前者是否是后者的一个对象 11 print(issubclass(Cat,Animal)) # True 判断cat是不是animal的子类
2、区分函数和类的成员方法
结论: 1, 对象访问的, 就是方法; 类名访问的, 就是函数;
2, 对于静态方法, 都是函数;
3, 对于类方法, 都是方法(任何类其实都是type类的对象,即对象访问)
from types import FunctionType, MethodType
print( isinstance(xxx, FunctionType) )
print( isinstance(xxx, MethodType) )
3、反射
通过字符串的形式从对象中动态的获取成员.
hasattr(obj,str) ----> 判断obj中是否有str成员(最常用)
getattr(obj,str) ----> 从obj中获取str成员(最常用)
setattr(obj,str,new) ----> 将obj中的str进行重写, 重写内容为new内容
delattr(obj,str) ----> 删除obj中的str成员
说明:
以上操作都是对内存中的文件进行修改的, 并不会影响源代码.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 class Base: 2 base = "父类的" 3 def chi(self): 4 print("吃的开心") 5 def he(self): 6 print("喝的好撑") 7 8 class Sclass(Base): 9 son = "子类的" 10 def __init__(self,name): 11 self.name = name 12 def wan(self): 13 print("玩得舒服") 14 p = Sclass("防滑链") 15 16 print(getattr(p,"name")) 17 print(getattr(p,"son")) 18 print(getattr(Sclass,"son")) 19 print(getattr(p,"base")) 20 print(getattr(Base,"base")) 21 22 print(getattr(p,"wan")) # 从对象里找,找到的是wan()方法的内存地址 23 print(getattr(Sclass,"wan")) # 从类里找,找到的是wan()函数的内存地址. 24 print(getattr(p,"wan")()) 25 26 # 如果想反射到别的.py文件,就必须导入 "import py文件名" ,getattr(py文件名.类名,str)
反射的另类用法: 通过字符串导入模块(原理不是反射, 只是有步骤用到了反射)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 path = "字符串导入模块.example.fanshe" # 模块路径 2 import importlib 3 inp = input("请输入要查看的类别[f1,f2,f3]: ") 4 m = importlib.import_module(path) # 通过字符串的形式来导入模块 5 if hasattr(m.Cate,inp): # m.Cate, 即inp是否在类的成员方法里面, 不能写直接写m, 找不到的 6 obj = m.Cate() # 创建obj对象 7 print(getattr(obj,inp)()) 8 else: 9 print("不存在此类别.")