本文实例讲述了Python面向对象之反射/自省机制。分享给大家供大家参考,具体如下:
反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省)
下面就介绍四种实现自省的函数,适用于类和对象
1. 判断object中有没有一个name字符串对应的属性或者方法
1
|
hasattr ( object ,name)
|
2. 获取object中name字符串对应的属性值或者方法地址,其中default参数的作用是,在找不到属性的时候,给予调用者的提示信息。
1
|
getattr ( object ,name,default = None )
|
3. 将object中name字符串对应的属性值设置为value,这个属性可以是新增的属性。
1
|
setattr ( object ,name,value)
|
4. 删除object中name字符串对应的属性。
1
|
delattr ( object ,name)
|
四个方法的演示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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还没有实现的全部功能
1
2
3
4
5
|
class FtpClient:
#ftp客户端,但是还没有实现功能
def __init__( self ,addr):
print ( '正在连接服务器[%s]' % ( self .addr))
self .addr = addr
|
A后期的代码编写
1
2
3
4
5
6
7
8
9
|
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程序设计有所帮助。
原文链接:https://blog.csdn.net/qq_33531400/article/details/79908733