合集 – Python(19)
1.1 安装Python08-282.2 Python开发工具:PyCharm08-283.3 Python开发工具:VSCode+插件08-284.4 Python虚拟环境介绍08-285.5 Python变量08-286.6 Python运算符和表达式08-287.7 Python流程控制08-288.8 Python基本数据结构08-289.9 Python函数08-2810.10 Python面向对象编程:类和对象以及和Java的对比09-0311.11 Python面向对象编程:三大特性,封装、继承、多态09-0312.12 Python面向对象编程:运算符重载09-0513.13 Python面向对象编程:装饰器09-05
14.14 Python面向对象编程:反射09-0615.15 Python模块09-0616.16 Python的包以及import和from的使用09-0917.17 Python异常处理(捕获异常、抛出异常、自定义异常)09-0918.18 Python如何操作文件?09-1019.Python 基础学习路线图【有PDF版】09-10
收起
本篇是 Python 系列教程第 14 篇,更多内容敬请访问我的 Python 合集
在Python中,“反射”通常指的是根据字符串查找并执行相关的类、方法或者属性的能力。Python提供了几个内置函数和语法特性来支持这种能力,比如getattr()
, setattr()
, hasattr()
, delattr()
以及dir()
等。这些功能使得程序可以在运行时动态地获取和设置对象的属性和方法,从而增强代码的灵活性。
前面函数那一篇粗略的介绍了Python内置函数,也讲到了getattr()
等内置函数,下面再系统具体的介绍一下。
常见的反射相关函数
getattr(object, name[, default])
:
作用:从给定的对象中获取指定名字的属性值。
如果属性存在,则返回该属性值;否则,如果提供了默认值,则返回默认值;如果没有提供默认值且属性不存在,则抛出AttributeError
。
setattr(object, name, value)
:
作用:为给定的对象设置指定名字的属性值。
如果对象不允许赋值,则抛出AttributeError
。
hasattr(object, name)
:
作用:检查给定的对象是否具有指定名字的属性。
返回布尔值。
delattr(object, name)
:
作用:删除给定对象的指定属性。
如果属性不存在,则抛出AttributeError
。
dir(object)
:
作用:返回一个包含对象的所有属性名的列表。
如果对象定义了__dir__()
方法,则优先使用该方法;否则使用默认方式。
示例
下面是一些使用这些反射函数的例子:
class MyClass:
def __init__(self):
self.x = 10
self.y = 20
def greet(self):
return "Hello from MyClass!"
# 创建一个MyClass的实例
my_instance = MyClass()
# 使用反射获取属性值
x_value = getattr(my_instance, 'x')
print(f"x 的值是: {x_value}") # 输出: x 的值是: 10
# 设置一个新的属性值
setattr(my_instance, 'z', 30)
# 检查是否有某个属性
has_z = hasattr(my_instance, 'z')
print(f"my_instance 是否有属性 z? {has_z}") # 输出: my_instance 是否有属性 z? True
# 删除属性
delattr(my_instance, 'z')
# 列出所有属性
all_attributes = dir(my_instance)
print("所有属性:", all_attributes)
使用反射的好处
动态性:反射使得程序能够在运行时动态地响应变化,例如,根据不同的输入或配置加载不同的类或方法。
代码重用:通过反射,可以编写通用的函数来处理不同类型的对象,只要这些对象遵循一定的接口或约定。
扩展性:反射可以方便地扩展程序的功能,而无需修改现有代码。
然而,过度使用反射可能会导致代码难以理解和维护,因为它打破了静态类型语言的一些预期。因此,在使用反射时要谨慎,并确保它确实能带来便利性和灵活性。
__EOF__
本文作者: 救苦救难韩天尊 本文链接: https://www.cnblogs.com/GilbertDu/p/18399743 关于博主: 评论和私信会在第一时间回复。或者直接私信我。 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处! 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。