面向对象之反射(定制)
Posted happyfei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象之反射(定制)相关的知识,希望对你有一定的参考价值。
什么是反射?
反射的盖面是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省),
这一概念的提出很快引发了计算机科学领域关于应用反射的研究。它首次被程序语言的设计领域所采用。并在Lisp和面向
对象方面取得了成绩。
python3中四个可以实现自省的函数,下列方法适用于类和对象
class BlackMedium: feture=‘Ugly‘ def __init__(self,name,addr): self.name=name self.addr=addr def sell_hourse(self): print(‘[%s]正在卖房子,傻逼才买呢‘%self.name) def rent_hourse(self): print(‘[%s]正在租房子,傻逼才买呢‘%self.name) b1=BlackMedium(‘黑中介‘,‘殡仪馆‘)
1、hasattr(object,name)
判断object中有没有一个name字符串对应的方法或属性
class BlackMedium: feture=‘Ugly‘ def __init__(self,name,addr): self.name=name self.addr=addr def sell_hourse(self): print(‘[%s]正在卖房子,傻逼才买呢‘%self.name) def rent_hourse(self): print(‘[%s]正在租房子,傻逼才买呢‘%self.name) b1=BlackMedium(‘黑中介‘,‘殡仪馆‘) print(b1.__dict__)#{‘name‘: ‘黑中介‘, ‘addr‘: ‘殡仪馆‘} # b1.name------->b1.__dict__[‘name] print(b1.name)#黑中介 print(b1.addr)#殡仪馆 #用hasattr检测类的属性和方法,存在返回TRUE,不存在返回FALSE print(hasattr(b1,‘name‘))#True print(hasattr(b1,‘addr‘))#True print(hasattr(b1,‘namnmae‘))#False
2、getattr(object,name,default=None)
检测正确时,有属性就返回属性值,有方法就返回方法的内存地址,加()就可以运行
检测有错误时,不给default赋值会报错,报错时写什么会提示什么
#检测属性,属性存在就会打印值,属性不存在会打印报错或default print(getattr(b1,‘name‘))#黑中介 print(getattr(b1,‘aaaaaa‘))#有报错提示 print(getattr(b1,‘aaaaaa‘,‘没有此属性‘))#有报错提示:没有此属性 #检测方法,有则返回内存地址,加()就可以运行,没有则报错或提示default信息 print(getattr(b1,‘sell_hourse‘,‘无此方法‘))#返回sell_hourse方法的内存地址,-------》b1.sell_hourse #<bound method BlackMedium.sell_hourse of <__main__.BlackMedium object at 0x0000020EE5447198>> #有内存地址加()就可以运行 func=getattr(b1,‘sell_hourse‘) func()#[黑中介]正在卖房子,傻逼才买呢 print(getattr(b1,‘jskdkflsd‘,‘无此方法‘))#无此方法
3、setattr(x,y,z)
可以增加修改属性,也可以增加方法,
x传入对象,y传入字符串相当于字典中的key,x传入值相当于字典中的value
print(b1.__dict__)#{‘name‘: ‘黑中介‘, ‘addr‘: ‘殡仪馆‘} setattr(b1,‘name‘,‘SB‘)#修改属性 setattr(b1,‘sb‘,True)#增加属性 print(b1.__dict__)#{‘name‘: ‘SB‘, ‘addr‘: ‘殡仪馆‘, ‘sb‘: True} setattr(b1,‘func‘,lambda self:self.name+‘SB‘)#增加函数属性 # print(b1.func(b1))#黑中介SB
4、delattr(x,y)
删除属性x,y同上
print(b1.__dict__)#{‘name‘: ‘黑中介‘, ‘addr‘: ‘殡仪馆‘} delattr(b1,‘name‘)#删除属性------》del b1.name # del b1.name print(b1.__dict__)#{‘addr‘: ‘殡仪馆‘}
以上是关于面向对象之反射(定制)的主要内容,如果未能解决你的问题,请参考以下文章