反射自省
#反射:指程序可以访问,检测,修改自身状态或行为的一种自省能力 #自省机制,函数方法 class People: country = "china" def __init__(self,name,age): self.name = name self.age = age def get_name(self): print(self.name) #系统提供一些以__开头的内置函数,当自己不设置时使用系统内置的,如果自己设置,则按照自己定义的方法执行,如下 def __getattr__(self, item): #当调用对象的属性不存在时,触发这个操作 print("执行getattr")
def __getattribute__(self, item):
print("执行getattribute") #不管属性是否存在,都会执行getattribute,并且优先调用这个内置方法
raise AttributeError("抛出异常") #通过设置一个Attributed的异常,当查找属性不存在时,执行getattr
def __delattr__(self, item): #当删除对象属性时,触发这个操作 print("执行删除delattr",item) self.__dict__.pop(item) #直接对底层字典操作 def __setattr__(self, key, value): #当设置对象属性时,触发这个操作 print("执行setattr",key,value) if type(value) is str: #因为在设置对象属性时会先触发__setattr__,所以可以先进行一个判断,进行筛选 print("开始设置") # self.key = value #这样设置会进入一个死递归 self.__dict__[key] = value #直接操作底层字典 else: print("必须是字符串") p1 = People("sjy",25) print(hasattr(p1,"get_name")) #检测这个属性方法是否存在 print(getattr(p1,"country","error")) #获取对象的属性内容,第三个参数可以设定当需要获取的参数不存在时返回的值 print(setattr(p1,"star","earth")) #设置一个对象属性的值,没有添加,有则修改 print(delattr(p1,"star")) #删除这个对象的某个属性 print(hasattr(People,"country")) #同样也可以用于类,对于Python来说,一切皆对象 p1.age1 = 12 print(p1.__dict__) """ hasattr(object,name) 检测这个object中是否存在name这个字符串的属性或方法,第一个参数是对象,第二个参数是字符串 getattr(object,name,default=None) 查找object中的name的属性实例,第三参数是在找不到这个属性时返回一个值,不设置时,没有会报错 相当于调用对象.属性,object.attribute setattr(object,name,value) 设置一个对象属性内容,相当于object.attribute = value delattr(object,name) 删除一个对象属性,相当于del object.attribute
isinstance(object,class) 判断object是否是class的对象
issubclass(sub,super) 判断sub是否是super的子类
"""
print(isinstance(p1,People)) #判断这个对象是否是这个类的对象
class Subpeo(People):
pass
print(issubclass(Subpeo,People)) #判断某个类是否是另一个类的子类
s1 = Subpeo("s",2)
print(isinstance(s1,People)) #子类的实例对象和父类做isinstance判断返回的也是True
print(type(s1)) #type实质是返回某个实例对象的类是谁
#反射自省,可以做一个判断某个对象中是否含有某个属性方法,然后再根据判断结果做下一步操作
__getitem__,__setitem__,__delitem__ 类似 attr 方法,不同的是item方法使用【】

浙公网安备 33010602011771号