小编给大家分享一下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__)
运行结果:
True
True
万成置地
万成置地租房子
该属性不存在
{'sb': True, 'show_name': <function <lambda> at 0x01BCA7F0>, 'name': '\xe4\xb8\x87\xe6\x88\x90\xe7\xbd\xae\xe5\x9c\xb0', 'addr': '\xe5\xa4\xa9\xe9\x9c\xb2\xe5\x9b\xad'}
万成置地sb
Traceback (most recent call last):
File "C:\py\jb51PyDemo\src\Demo\test.py", line 37, in <module>
delattr(b1,'show_name123')
AttributeError: BlackMedium instance has no attribute 'show_name123'
为什么用反射呢?
举例:两个程序员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('处理其他的逻辑')
以上是“Python面向对象之反射机制怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注天达云行业资讯频道!