setattr、getattr和hasattr的作用和用法

news/2024/11/30 14:45:18/

setattr、getattr和hasattr的作用和用法

1. setattr
setattr() 是 Python 内置函数之一,用于设置对象的属性或方法。setattr() 接受三个参数:第一个参数是对象,第二个参数是字符串形式的属性名或方法名,第三个参数是要设置的属性或方法的值或引用。

当我们需要在运行时动态设置对象的属性或方法时,可以使用 setattr() 函数。例如:

class MyClass:def __init__(self):self.x = 1obj = MyClass()
# 设置对象的属性
setattr(obj, 'y', 2)
print(obj.y)    # 输出 2
# 设置对象的方法
setattr(obj, 'my_method', lambda self: print("Hello World"))
obj.my_method()    # 输出 Hello World

在上面的例子中,我们首先创建了一个 MyClass 类的实例 obj,然后使用 setattr() 函数设置了对象的属性 y 和方法 my_method()。
setattr() 函数可以用于在运行时动态设置对象的属性或方法,从而实现代码的灵活性和可维护性。需要注意的是,如果要设置的属性或方法名已经存在,setattr() 函数将会覆盖原有的属性或方法。
另外需要注意的是,在设置对象的属性或方法时,我们通常需要使用对象的引用或 self 参数来定义方法。例如:

class MyClass:def __init__(self):self.x = 1def my_method(self):print("Hello World")obj = MyClass()
# 设置对象的属性
setattr(obj, 'y', 2)
print(obj.y)    # 输出 2
# 设置对象的方法
setattr(obj, 'my_method2', lambda: print("Hello World"))
# 调用对象的方法,注意需要传入 self 参数
setattr(obj, 'my_method3', lambda self: self.my_method())
obj.my_method2()    # 输出 Hello World
obj.my_method3()    # 输出 Hello World

在上面的例子中,我们使用 setattr() 函数设置了对象的方法 my_method2() 和 my_method3(),并在 my_method3() 中调用了对象的原有方法 my_method()。需要注意的是,在调用对象的方法时,我们需要传入对象的引用或 self 参数。

2. getattr
getattr() 是 Python 内置函数之一,用于获取对象的属性或方法。getattr() 接受两个参数:第一个参数是对象,第二个参数是字符串形式的属性名或方法名。
当我们需要在运行时根据字符串形式的属性名或方法名来获取对象的属性或方法时,可以使用 getattr() 函数。例如:

class MyClass:def __init__(self):self.x = 1def my_method(self):print("Hello World")obj = MyClass()
# 获取对象的属性
print(getattr(obj, 'x'))    # 输出 1
# 获取对象的方法
getattr(obj, 'my_method')()    # 输出 Hello World

在上面的例子中,我们首先创建了一个 MyClass 类的实例 obj,然后使用 getattr() 函数获取了对象的属性 x 和方法 my_method()。

getattr() 函数还可以设置默认值,当获取的属性或方法不存在时,会返回默认值。例如:

class MyClass:def __init__(self):self.x = 1def my_method(self):print("Hello World")obj = MyClass()
# 获取对象的属性,如果属性不存在返回默认值
print(getattr(obj, 'y', 2))    # 输出 2
# 获取对象的方法,如果方法不存在返回默认值
print(getattr(obj, 'my_method2', lambda: 'default')())    # 输出 default

在上面的例子中,我们使用 getattr() 函数获取了对象的属性 y 和方法 my_method2(),并设置了默认值。由于对象并没有属性 y 和方法 my_method2(),因此 getattr() 函数返回了设置的默认值。

3. hasattr
hasattr() 是 Python 内置函数之一,用于判断对象是否具有指定的属性或方法。hasattr() 接受两个参数:第一个参数是对象,第二个参数是字符串形式的属性名或方法名。

当我们需要在运行时判断对象是否具有指定的属性或方法时,可以使用 hasattr() 函数。例如:

class MyClass:def __init__(self):self.x = 1def my_method(self):print("Hello World")obj = MyClass()
# 判断对象是否具有属性
print(hasattr(obj, 'x'))    # 输出 True
# 判断对象是否具有方法
print(hasattr(obj, 'my_method'))    # 输出 True

在上面的例子中,我们首先创建了一个 MyClass 类的实例 obj,然后使用 hasattr() 函数判断对象是否具有属性 x 和方法 my_method()。

hasattr() 函数返回一个布尔值,如果对象具有指定的属性或方法,则返回 True,否则返回 False。例如:

class MyClass:def __init__(self):self.x = 1obj = MyClass()
# 判断对象是否具有属性,返回 True
print(hasattr(obj, 'x'))
# 判断对象是否具有方法,返回 False
print(hasattr(obj, 'my_method'))

在上面的例子中,我们使用 hasattr() 函数判断对象是否具有属性 x 和方法 my_method(),由于对象没有方法 my_method(),因此返回 False。

hasattr() 函数通常用于在运行时动态判断对象是否具有指定的属性或方法,从而避免在代码中写死属性或方法名,提高代码的灵活性和可维护性。


http://www.ppmy.cn/news/535853.html

相关文章

Qt Model-View架构领悟

1.架构的选择 1.1是否需要委托 模型视图架构图如下所示,模型视图架构源于MVC模式:模型(Model)是应用对象,表示数据;视图(View)是模型的用户界面,用以显示数据&#xff…

RocketMQ常用操作

RocketMQ历史及发展 如果想要了解RocketMQ的历史,则需了解阿里巴巴中间件团队中的历史 2011年,Linkin(领英:全球知名的职场社交平台)推出Kafka消息引擎,阿里巴巴中间件团队在研究了Kafka的整体机制和架构设计之后,基…

互联网大厂持续裁员,疫情彻底放开,2023年你敢主动跳槽吗?

随着第一批阳过之后,上班的人增多了,地铁站人基本恢复了往常的人流,商场的人也增加了,生活逐步要恢复正常了。不过就是年底了还听到一些大厂裁员的消息,也许企业经营效益的恢复还需要一定的时间。经济靠出口、投资、消…

成都富士康车间爆炸对iPad市场的冲击

5月20日晚,富士康集团鸿富锦成都公司抛光车间在生产中发生爆炸事故,目前已造成3人死亡,16人受伤,其中重伤2人。事故原因初步认定为抛光车间收尘风管可燃粉尘意外爆炸引发。  目前,成都公司事故车间及与其制造流程相同…

富士康打工到底能不能攒到钱?

一位在富士康打工多年的厂妹说到,出来打工这么多年,从刚开始的身无分文到现在的负债累累。 富士康是劳动力密集型产业的佼佼者,劳动密集型产业的基本特点是它的成本中劳动成本最高,资本家想要赚更多的钱,势必需要把劳动…

苹果员工反对线下复工计划

本文转载自IT之家 IT之家 6 月 5 日消息 苹果公司 CEO 蒂姆・库克 (Tim Cook) 周三向员工发出电邮通知,要求从 9 月初开始员工每周要返回办公室工作至少 3 天。 库克称,大部分员工将被要求在周一、周二以及周四返回办公室工作,周三和周五可选…

自己的故事自己讲--富士康之旅

我在太原人才市场转了很久发现了一件事那就是我真的是个废物,除了出苦力我真的是一个废物。可是我不想当这个废物啊。那天我记得自己在人家展厅里做了很久,想了很多东西。于是我开始想自己创业。 现在回头看自己的那些事,也觉得当时的自己真…

富士康为什么天天招工?

第一:人员流动性大百分之八十的员工都是从事最底层的流水线上工作,工作枯燥,只要你身体健康四肢健全,没有学历识字的都可以进,很多人会去尝试这份工作,富士康的工作都是每天在流水线一直重复相同的工作&…