day23-1 isinstance、issubclass和反射

目录

isinstance和issubclass

  • isinstance(obj,cls)检查obj是否是cls的对象,它会检查父类
class Foo:
    pass

f = Foo()
print(isinstance(f,Foo))  # f是Foo的实例化对象,所以打印True
True
class Foo(object):
    pass

class Bar(Foo):
    pass

print(isinstance(Bar(), Foo))  # 可以检查父类
True
  • type()也可以用来获取实例化出对象的类,但它不能检测父类
class Foo(object):
    pass

class Bar(Foo):
    pass

print(type(Foo()) == Foo)  # Foo()是Foo的实例化对象,type(Foo())就是Foo
print(type(Bar()) == Foo)  # Bar()是Bar的实例化对象,type(Bar())是Bar,所以返回False
True
False
  • issubclass(sub,super)检查sub类是否是super的子类或派生类
class Foo:
    pass

class Bar(Foo):
    pass

print(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 = age

f = Foo('nick', '18')
print(hasattr(f, 'name'))  # True
print(hasattr(f, 'gender'))  # False

print(getattr(f, 'name'))  # nick
print(getattr(f, 'gender', None))  # 不存在该属性时返回第三个参数None,不写会报错

setattr(f, 'gender', 'male')
print(f.gender)  # male

delattr(f, 'gender')
print(f.__dict__)  # {'name': 'nick', 'age': '18'}
上一篇:underscore源码解析


下一篇:day23 xml模块、面向对象编程介绍