讲讲setattr(), getattr(), hasattr() 函数详解及实战示例

Python3 测试开发系列

第一章 讲讲setattr(), getattr(), hasattr() 函数详解及实战示例



一、setattr(), getattr(), hasattr()是什么?

在Python3面向对象编程中,setattr(), getattr(), hasattr() 这三个函数尤为重要,它们提供了动态操作对象属性的能力。本文将详细介绍这三个函数的用法,并通过一个测试开发的实战例子来展示它们的实际应用。

二、基础用法

1.setattr()

setattr(obj, name, value) 函数用于设置属性值,该函数接受三个参数:obj 是对象,name 是属性名称的字符串形式,value 是要设置的新值。

代码如下(示例):

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

p = Person("Tom")

# 给 p 对象添加一个名为 'age' 的属性,值为 25
setattr(p, 'age', 25)

2.getattr()

getattr(obj, name[, default]) 函数用于获取对象的属性值。如果属性不存在,且提供了 default 值,则返回 default;否则抛出 AttributeError 异常。

代码如下(示例):

# 输出: 25
print(getattr(p, 'age'))

# 由于 'gender' 属性不存在,返回默认值 'Male'
print(getattr(p, 'gender', 'Male'))

3.hasattr()

hasattr(obj, name) 函数用于判断对象是否包含名为 name 的属性。

代码如下(示例):

# 存在 age 输出: True
print(hasattr(p, 'age'))

# 不存在 gender 输出: False
print(hasattr(p, 'gender'))

三、实战实例

1.hasattr() 结合 setattr() 的项目实战

假设有一个需求:往一张库表里面更新数据。
以下示例:在使用 SQLAlchemy ORM 与 SQLite 数据库交交互时,动态更新数据库中的 AppUser 记录

代码如下(示例):

# 引入相关库
from sqlalchemy.orm import Session
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

# 定义数据库模型基类
Base = declarative_base()

# 定义AppUser模型
class AppUser(Base):
    __tablename__ = 'app_users'  # 指定数据库表名
    id = Column(Integer, primary_key=True)  # 定义一个列作为主键
    name = Column(String)  # 定义一个字符串列
    email = Column(String)  # 定义另一个字符串列

# 创建数据库引擎
# 这里使用内存中的 SQLite 数据库,仅作为示例。
# 在实际应用中,您需要根据实际情况配置,比如使用 MySQL 或 PostgreSQL。
engine = create_engine('sqlite:///:memory:', echo=True)

# 创建Session
# Session 是与数据库进行交云的会话,用于管理事务。
db = Session(bind=engine)

# 查询数据库中的AppUser记录
db_app_user = db.query(AppUser).filter_by(id=1).first()

# 准备更新的用户数据
app_user_dict = {
    'name': 'New Name',
    'email': 'newemail@example.com'
}

# 遍历准备更新的数据
for field, value in app_user_dict.items():
    # 检查 db_app_user 对象是否有对应的属性
    # hasattr 函数用于判断对象是否包含具有指定名称的属性。
    # 这里用它来确保我们不会尝试更新不存在的字段,避免出错。
    if hasattr(db_app_user, field):
        # 使用 setattr 动态设置属性值
        # setattr 函数用于设置对象的属性值。这里它允许我们根据字段名动态地更新 db_app_user 对象的属性。
        setattr(db_app_user, field, value)

# 提交更新到数据库
db.commit()

2.getattr()的实战实例

假设我们正在开发一个智能家居系统,系统中有多种智能设备,如灯泡、空调和扫地机器人等。不同型号的设备可能需要通过不同的方法来控制。为了简化设备控制的逻辑,我们可以使用 getattr 动态调用对应设备型号的控制方法。这样做的好处是代码更加简洁,易于维护,同时也提高了代码的复用性。

代码如下(示例):

class SmartHome:
    def __init__(self):
        pass

    # 控制灯泡的方法,接受任意数量的关键字参数
    def control_light_bulb(self, **kwargs):
        print(f"控制灯泡的参数为 {kwargs}")

    # 控制空调的方法,接受任意数量的关键字参数
    def control_air_conditioner(self, **kwargs):
        print(f"控制空调的参数为 {kwargs}")

    # 控制扫地机器人的方法,接受任意数量的关键字参数
    def control_robot_vacuum(self, **kwargs):
        print(f"控制扫地机器人的参数为 {kwargs}")

# 设备名称,这里以灯泡为例
name = 'light_bulb'

# 创建 SmartHome 类的实例
home = SmartHome()

# 准备传递给控制方法的参数
kwargs = {
    "brightness": 70,  # 亮度
    "color": 'warm white',  # 颜色
}

# 使用 getattr 动态获取并调用对应设备的控制方法
# f'control_{name}' 构造了方法名字符串,例如 'control_light_bulb'
getattr(home, f'control_{name}')(**kwargs)

总结

总的来说,setattr, getattr, 和 hasattr 提供了一种强大的机制来动态地操作对象的属性,使得 Python 代码可以根据运行时的情况灵活地调整其行为。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
getattr函数用于获取对象的属性值,语法为: ```python getattr(object, name[, default]) ``` 其中,object是需要获取属性值的对象,name是属性名,default是默认值(可选)。如果该对象存在指定属性,则返回属性值;如果不存在该属性,则根据default参数返回默认值或抛出AttributeError异常。举个例子: ```python class Person: name = 'Tom' age = 18 p = Person() print(getattr(p, 'name')) # 输出:Tom print(getattr(p, 'gender', 'unknown')) # 输出:unknown ``` 在上面的例子中,Person是一个类,p是Person类的一个实例。我们使用getattr函数获取了实例p的name属性值,以及gender属性(不存在)的默认值。 setattr函数用于设置对象的属性值,语法为: ```python setattr(object, name, value) ``` 其中,object是需要设置属性值的对象,name是属性名,value是属性值。如果该对象已存在指定属性,则更新属性值;如果不存在该属性,则创建该属性并设置属性值。举个例子: ```python class Person: name = 'Tom' age = 18 p = Person() setattr(p, 'age', 20) setattr(p, 'gender', 'male') print(p.age, p.gender) # 输出:20 male ``` 在上面的例子中,我们使用setattr函数分别设置了实例p的age和gender属性值。 hasattr函数用于检查对象是否存在指定属性,语法为: ```python hasattr(object, name) ``` 其中,object是需要检查的对象,name是属性名。如果该对象存在指定属性,则返回True;否则返回False。举个例子: ```python class Person: name = 'Tom' age = 18 p = Person() print(hasattr(p, 'name')) # 输出:True print(hasattr(p, 'gender')) # 输出:False ``` 在上面的例子中,我们使用hasattr函数分别检查了实例p的name和gender属性是否存在。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值