2023-简单点-Python中的attr那些事-hasattr,getattr,setattr

本文详细介绍了Python中hasattr()函数用于检查对象是否存在属性,getattr()用于安全获取属性值并提供默认值,以及setattr()用于设置对象属性。着重讲解了它们的语法、工作原理和使用场景,包括动态属性的创建和处理。
摘要由CSDN通过智能技术生成

hasattr

假设有一个名为Person的类,具有name和age属性:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

现在创建一个Person对象,并使用hasattr()函数检查该对象是否具有name和gender属性:

person = Person("Alice", 30)
print(hasattr(person, "name"))  # 输出: True
print(hasattr(person, "gender"))  # 输出: False

在上面的例子中,通过hasattr()函数检查person对象是否具有属性name和gender,并分别返回True和False。因为Person类只定义了name和age属性,所以检查gender属性返回False。

注意:属性名称必须是字符串类型的,如果使用标识符(未加引号的名称),则Python会将其解释为变量,并引发错误。

getattr

getattr 是 Python 的一个内置函数,用于获取对象的属性值。如果指定的属性存在,则返回其值;否则,可以指定一个默认值返回,或者触发 AttributeError 异常。

语法

getattr(object, attribute_name[, default])
  • object: 需要获取属性的对象。
  • attribute_name: 字符串,指定需要获取的属性名。
  • default (可选): 如果指定的属性不存在,则返回此默认值。如果不提供此参数并且属性不存在,将触发 AttributeError

示例

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建一个 Person 对象
person = Person("Alice", 30)

# 使用 getattr 获取属性
name = getattr(person, "name")
age = getattr(person, "age")
print(name, age)  # 输出: Alice 30

# 尝试获取不存在的属性,触发 AttributeError
try:
    non_existent = getattr(person, "non_existent")
except AttributeError as e:
    print(f"Caught an AttributeError: {e}")  # 输出: Caught an AttributeError: 'Person' object has no attribute 'non_existent'

# 使用默认值
non_existent_with_default = getattr(person, "non_existent", "Default Value")
print(non_existent_with_default)  # 输出: Default Value

使用场景

getattr 在很多场景下都很有用,尤其是当你不确定对象是否具有某个属性时。它可以让你更安全地访问属性,而不用担心触发 AttributeError。此外,它还可以用于动态地访问属性,即属性名是在运行时确定的。

setattr

setattr()是Python中的一个内置函数,用于设置对象的属性值。该函数接受三个参数:对象、属性名称和属性值。它的作用是将指定的属性值赋给对象的指定属性。

语法

setattr(object, attribute_name, value)
  • object: 需要设置属性的对象。
  • attribute_name: 字符串,指定需要设置的属性名。
  • value: 需要赋给属性的值。

工作原理

setattr()函数的工作原理是通过将属性值赋给对象的属性来实现对属性的设置。在Python中,对象的属性是通过在对象上调用一个名为__setattr__的特殊方法来实现的。setattr()函数内部调用了这个特殊方法来完成属性的设置操作。

示例

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建一个 Person 对象
person = Person("Alice", 30)
print(person.name)  # 输出: Alice
print(person.age)  # 输出: 30

# 使用 setattr 设置属性值
setattr(person, "name", "Bob")
setattr(person, "age", 35)
print(person.name)  # 输出: Bob
print(person.age)  # 输出: 35

在上面的示例中,我们首先创建了一个Person对象,然后使用setattr()函数来设置对象的属性值。通过调用setattr(person, “name”, “Bob”),将person对象的name属性设置为"Bob",类似地,通过调用setattr(person, “age”, 35),将age属性设置为35。最后,我们打印出设置后的属性值,验证了setattr()函数的效果。

注意事项

需要注意的是,setattr()函数可以直接设置对象的属性,包括已有的属性和不存在的属性。如果设置的属性名不存在于对象中,setattr()函数将会动态地创建该属性并将指定的值赋给它。这意味着可以通过setattr()函数来动态地添加新的属性到对象中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万物琴弦光锥之外

给个0.1,恭喜老板发财

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值