十三、反射(自省)

反射(自省):主要是指程序可以访问、检测和修改它本身状态或行为的一种能力

四个可以实现自省的函数:

  1、hasattr(object,name)     

    object--->对象,name--->字符串

    判断object中有没有一个name字符串对应的方法或属性

class AAA:
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr
    def sale(self):
        print('----->')
p1=AAA('alex','nanjing')
print(hasattr(p1,'name'))   #True 
print(hasattr(p1,'sale'))    #True
print(hasattr(p1,'shugl'))    #False

  2、getattr(object,name,default=None)

    运行object对象所对应的name方法。若指定了default,不存在name时显示default内容,不指定时报错

class AAA:
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr
    def sale(self):
        print('----->')
p1=AAA('alex','nanjing')
print(getattr(p1,'name'))   # alex
print(getattr(p1,'sale'))    #返回sale函数的内存地址
func=getattr(p1,'sale')
func()        #----->
print(getattr(p1,'shugl','没有这个参数'))    #没有这个参数
print(getattr(p1,'shugl'))    #报错

  3、setattr(object,name,value)

    设置object对象的name属性值为value

class AAA:
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr
    def sale(self):
        print('----->')
p1=AAA('alex','nanjing')
setattr(p1,'name','alex1234')  
print(p1.name)    #alex1234
setattr(p1,'age',30)
print(p1.__dict__)   #{'age':'30','name':'alex','addr':'nanjing'}

  4、del (object,name)

    删除object对象的name属性

class AAA:
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr
    def sale(self):
        print('----->')
p1=AAA('alex','nanjing')
print(p1.__dict__)     #{'name':'alex','addr':'nanjing'}
delattr(p1,'name')  
print(p1.__dict__)   #{'addr':'nanjing'}

  

猜你喜欢

转载自www.cnblogs.com/haoy/p/10564126.html