Python 中的反射

本文介绍了Python中的反射概念,主要用于在运行时操作类对象的属性和方法。反射主要内容包括反射类、对象和模块成员。文章详细讲解了hasattr()用于检查对象属性是否存在,getattr()用于获取属性值,setattr()用于添加或修改属性,以及delattr()用于删除属性的操作。这些方法在动态调整对象状态时非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、 反射的概念

反射主要应用于类的对象上,在运行时,将对象中的属性和方法反射出来,通过字符串对对象成员(属性、方法)进行查找、获取、删除、添加成员等动作,是一种基于字符串的事件驱动技术。

2、 反射的主要内容

反射的内容包括但不限于如下内容:

  • 反射类中成员

  • 反射对象中的成员

  • 反射模块中的成员

对应 python 里的反射有下面四种常见方法:

方法

用法

hasattr(obj,name_str)

判断输入的name_str字符串在对象obj中是否存在(属性或方法),存在返回True,否则返回False。

getattr(obj,name_str)

将按照输入的name_str字符串在对象obj中查找,如找到同名属性,则返回该属性;如找到同名方法,则返回方法的引用;如果未能找到同名的属性或者方法,则抛出异常:AttributeError。

setattr(obj,name_str,value)

name_str为属性名或者方法名,value为属性值或者方法的引用。

delattr(obj,name_str)

将你输入的字符串name_str在对象obj中查找,如找到同名属性或者方法就进行删除。

3、hasattr() getattr() setattr()delattr()的用法

3.1 hasattr()
hasattr(object, name)

检查对象(类)的属性是否存在,属性存在返回True,否则返回False。

3.2 getattr()
getattr(object, name[, default])

获取对象(类)的属性,返回对象指定的属性值,不存在返回设置的默认值,不设置默认值时得不到属性值会报错

#创建类
class main:
    a = 1
    b = 2
    c = 3

    def run(self):
        print(123)

#实例化对象
o = main()

#获取并打印已存在的属性:'c'
print(getattr(o, 'c'))
#结果:3

#获取并打印不存在的属性:'d'
print(getattr(o, 'd', '这是默认值'))
#结果:这是默认值
#由于d属性不存在,所以使用了设置的默认值。

#尝试获取对象的方法
print(getattr(o, 'run'))
#结果:由尖括号括起来的方法标识,一般不用getattr()获取方法。
3.3 setattr()

添加对象(类)的属性

setattr(object, name, value)

第一个参数是一个对象,第二个参数是属性的名称(该名称可以是已经存在的属性也可以是不存在的属性),第三个参数是属性的值(可以是任意值),如果第二个参数的属性名是对象已存在的属性,则会覆盖原属性的值,如果是不存在的属性名称,则会新增属性到对象中。例如,setattr(o,'new',123)等效于o.new = 123。

#创建类
class main:
    a = 1
    b = 2

    def run(self):
        print(123)

#实例化类
o = main()

#新增属性C
setattr(o, 'c', 5)

#打印新输出
print(o.c)
#输出结果:5

#需要注意,不仅填写的已存在的属性名称会覆盖已有属性的值。填写了已存在的方法名称,也会覆盖这个方法的。在一些比较严格的情况下,尽量先检查属性的类型或者是否已经存在。
setattr(o, 'run', 10)
print(o.run)
#输出结果:10
3.4 delattr()
delattr(object, name)

删除对象(类)的属性,不存在则会报错,不允许删除对象方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值