Python.面向对象------反射/自省

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

下面就介绍四种实现自省的函数,适用于类和对象

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

hasattr(object,name)

2,获取object中name字符串对应的属性值或者方法地址,其中default参数的作用是,在找不到属性的时候,给予调用者的提示     信息。

getattr(object,name,default= None)

3,将object中name字符串对应的属性值设置为value,这个属性可以是新增的属性。

setattr(object,name,value)

4,删除object中name字符串对应的属性。

delattr(object,name)

四个方法的演示

class BlackMedium:
    feture = 'Ugly'
    def __init__(self,name,addr):
        self.name = name
        self.addr = addr
    def sell_house(self):
        print('%s卖房子'%(self.name))
    def rent_house(self):
        print('%s租房子'%(self.name))

b1 = BlackMedium('万成置地','天露园')


#检测是否含有某个属性
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_house'))

#获取属性
temp = getattr(b1,'name')
print(temp)
func = getattr(b1,'rent_house')
func()

#getattr(b1,'aaaaaa')             获取不存在的属性,就会报错。
print(getattr(b1,'aaaaa','该属性不存在'))


#设置数据属性和方法属性
setattr(b1,'sb',True)
setattr(b1,'show_name',lambda self:self.name + 'sb')
print(b1.__dict__)
print(b1.show_name(b1))


#删除属性
delattr(b1,'addr')
delattr(b1,'show_name')
#删除不存在的属性,报错
delattr(b1,'show_name123')
print(b1.__dict__)

为什么用反射呢?

举例:两个程序员A,B,A在写程序用到B写的类,但是B还没有完成这个类的编写。此时就可以用到反射,完成A自己想要编写          的代码。并且不影响B的后期编码。

好处:可以事先定义好接口,接口只有在被完成时,才会真正执行,实现了即插即用,也就是一种后期绑定,即先定义接口,后           期在实现接口的功能。

B还没有实现的全部功能

class FtpClient:
     #ftp客户端,但是还没有实现功能
     def __init__(self,addr):
         print('正在连接服务器[%s]'%(self.addr))
         self.addr = addr

A后期的代码编写

from module import FtpClient
f1 = FtpClient('198.1.1.1')
#在编写某个方法前,先判断该方法是否存在,存在就可以直接调用,不存在就要编写。
if hasattr(f1,'get'):
    func_get = getattr(f1,'get')
    func_get()
else
    print('-----》不存在这个方法')
    print('处理其他的逻辑')


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值