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 代码可以根据运行时的情况灵活地调整其行为。