反射自省

#反射:指程序可以访问,检测,修改自身状态或行为的一种自省能力

#自省机制,函数方法

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方法使用【】

posted @ 2019-05-10 01:21  saber゛  Views(198)  Comments(0)    收藏  举报