目录
isinstance和issubclass
- isinstance(obj,cls)检查obj是否是cls的对象,它会检查父类
class Foo: passf = Foo()print(isinstance(f,Foo)) # f是Foo的实例化对象,所以打印True
True
class Foo(object): passclass Bar(Foo): passprint(isinstance(Bar(), Foo)) # 可以检查父类
True
- type()也可以用来获取实例化出对象的类,但它不能检测父类
class Foo(object): passclass Bar(Foo): passprint(type(Foo()) == Foo) # Foo()是Foo的实例化对象,type(Foo())就是Fooprint(type(Bar()) == Foo) # Bar()是Bar的实例化对象,type(Bar())是Bar,所以返回False
TrueFalse
- issubclass(sub,super)检查sub类是否是super的子类或派生类
class Foo: passclass Bar(Foo): passprint(issubclass(Bar,Foo)) # Bar是Foo的子类,所以打印True
True
反射(hasattr,getattr,setattr,delattr)
1.反射就是通过字符串来操作类或者对象的属性
2.反射本质就是在使用内置函数,其中反射有以下四个内置函数:
- hasattr: 通过字符串判断一个属性是否存在这个类或对象中
- getattr:通过字符串获取类或对象中的某个属性
- setattr:通过字符串修改类或对象的属性
- delattr:通过字符串删除类或对象的属性
class Foo: school = 'oldboy' def __init__(self,name,age): self.name = name self.age = agef = Foo('nick', '18')print(hasattr(f, 'name')) # Trueprint(hasattr(f, 'gender')) # Falseprint(getattr(f, 'name')) # nickprint(getattr(f, 'gender', None)) # 不存在该属性时返回第三个参数None,不写会报错setattr(f, 'gender', 'male')print(f.gender) # maledelattr(f, 'gender')print(f.__dict__) # {'name': 'nick', 'age': '18'}