Python面向对象之反射/自省机制实例分析

作者:我是马克思小清新 时间:2022-07-27 06:57:53 

本文实例讲述了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程序设计有所帮助。

来源:https://blog.csdn.net/qq_33531400/article/details/79908733

标签:Python,面向对象,反射,自省
0
投稿

猜你喜欢

  • css设计的具有亲和力的表格

    2008-03-16 19:28:00
  • 如何使用PHP计算上一个月的今天

    2023-11-15 14:16:25
  • 番茄的js表单验证类

    2008-01-07 13:53:00
  • itchat-python搭建微信机器人(附示例)

    2022-05-04 00:00:54
  • PHP中的session永不过期的解决思路及实现方法分享

    2023-11-20 11:19:23
  • 根据Dreamweaver里的ToolTip代码改进的提示框

    2008-11-27 12:19:00
  • java前端javascript生成动态表格示例演示

    2023-08-24 11:13:45
  • Python关于print的操作(倒计时、转圈显示、进度条)

    2022-08-19 07:26:58
  • 利用javaScript实现点击输入框弹出窗体选择信息

    2023-09-13 03:14:50
  • js读取图片的宽和高

    2007-08-04 10:14:00
  • 一个简单的鼠标划过切换效果js源码

    2010-06-21 10:55:00
  • ServerXMLHTTP的超时设置(setTimeouts)参数含义

    2009-02-12 12:51:00
  • 带你深入了解Access数据库的4种安全方式

    2008-11-28 14:34:00
  • 浅谈LogMiner的使用方法

    2009-02-28 11:12:00
  • python中的元组与列表及元组的更改

    2023-10-19 07:28:04
  • Python个人博客程序开发实例用户验证功能

    2023-07-31 14:24:36
  • 加快Firefox 3.5启动速度的方法

    2009-07-16 15:22:00
  • 适合所有表的添加、删除、修改的函数

    2008-04-15 15:29:00
  • 通过启动脚本来感受ASP的力量

    2008-11-07 15:25:00
  • 关于网站导航设计的探讨

    2008-02-28 13:20:00
  • asp之家 网络编程 m.aspxhome.com