11.反射(内置函数的一种)

反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

1.hasattr(object,key)

判断object中有没有一个name字符串对应的方法或属性,即判断object.key存不存在

2.getattr(object, key, default=None)

得到object中name属性对应的值,相当于执行object.dict[‘key’],得到该字典关键字对应的值,若值不存在返回default后面的默认值。

3.setattr(object, key, value)

将类object中的关键字key对应的值改成value,或者增加关键字以及对应的的值,(增加object的数据属性)

4.delattr(object, key)

删除类object字典中key对应的关键字以及对应的值,相当于执行 del object.key

四个函数代码如下:

class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def tell_info(self):
        print('name :%s /n age:%s' %(self.name,self.age))

stu=People('sunwukong',188)

print(hasattr(stu,'name'))                   #True

print(getattr(stu,'name',None))              #sunwukong
print(getattr(stu,'sex','不存在该关键字'))     #不存在该关键字

setattr(stu,'name','tangsanzang')
print(stu.name)                                #tangsanzang
setattr(stu,'sex','male')
print(stu.sex)                                 #male

delattr(stu,'sex')
print(stu.sex )            #程序会报错:AttributeError: sex
反射的应用

class Service:
    def run(self):
        while True:
            inp=input('--->').strip()
            cmds=inp.split()
            if hasattr(self,cmds[0]):
                func=getattr(self,cmds[0])
                func(cmds)

    def get(self,cmds):
        print('执行get \n输出:',cmds[1])

    def put(self,cmds):
        print('执行put \n输出:',cmds[1])


serv=Service()
serv.run()

#运行结果如下:
# --->get qq:1332606303
# 执行get 
# 输出: qq:1332606303
# --->put qq
# 执行put 
# 输出: qq
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值