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

远山来客
远山来客
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析Python面向对象中的反射(自省)机制,详细演示hasattr、getattr、setattr和delattr四个核心函数的用法。通过具体代码案例,展示如何动态检测、获取、设置及删除对象属性,并探讨利用反射实现接口解耦与后期绑定的实际应用场景。

本文通过具体实例,详细解析Python面向对象编程中的反射(或称自省)机制,旨在为读者提供清晰的参考与学习素材。

所谓反射,即程序具备访问、检测并修改自身状态或行为的能力,这一特性在Python中被称为自省。

接下来将重点介绍适用于类和对象的四种自省实现函数。

第一类函数用于判断指定对象中是否存在由字符串name标识的属性或方法。

hasattr(object,name)

第二类函数用于获取对象中由字符串name标识的属性值或方法引用。其中,default参数用于指定当属性不存在时返回的提示信息,避免直接报错。

getattr(object,name,default= None)

第三类函数用于将对象中由字符串name标识的属性值设置为value。需要注意的是,该操作允许动态新增原本不存在的属性。

setattr(object,name,value)

第四类函数用于删除对象中由字符串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\xe6'} 万成置地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开发的类,但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其他方面感兴趣,建议查阅本站相关专题,包括《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》以及《Python入门与进阶经典教程》。

希望本文关于Python反射机制的阐述能对您的程序设计工作有所帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。