You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.9中实现支持默认值的灵活类初始化方法

更Pythonic的动态属性类实现

需求背景

需要在Python 3.9中实现一个类,满足以下规则:

  • 可通过关键字参数或字典设置类属性
  • 传入参数的键名若匹配属性,则用传入值设置该属性
  • 未传入的属性使用预设的默认值
  • 新增属性时无需修改类的初始化逻辑,具备良好的扩展性

常规写法需要硬编码每个参数的判断或默认值,新增属性时必须修改__init__方法,扩展性较差。我们可以用更Pythonic的方式实现,无需为每个参数硬编码。

实现方案

通过预设默认属性字典,结合**kwargs动态合并属性并批量赋值给实例,完美满足需求:

class Example:
    # 预设默认属性,新增默认属性直接在此添加
    DEFAULT_ATTRS = {
        "x": "default_x"
    }

    def __init__(self, **kwargs):
        # 合并默认属性与传入参数,传入参数优先级更高
        merged_attrs = {**self.DEFAULT_ATTRS, **kwargs}
        # 批量将属性赋值给实例
        for attr_name, attr_value in merged_attrs.items():
            setattr(self, attr_name, attr_value)

测试示例

调用方式及效果:

# 传入部分参数,未传入的属性使用默认值
obj = Example(y="some", z=1, w=2)
print(obj.x)  # 输出: default_x
print(obj.y)  # 输出: some
print(obj.z)  # 输出: 1
print(obj.w)  # 输出: 2

# 覆盖默认属性值
obj2 = Example(x="custom_x", y="another_value")
print(obj2.x)  # 输出: custom_x

扩展支持字典参数

如果需要同时支持直接传入字典作为参数,可以修改__init__方法,兼容两种传参方式:

class Example:
    DEFAULT_ATTRS = {"x": "default_x"}

    def __init__(self, attrs=None, **kwargs):
        # 处理传入的字典参数,无字典则为空字典
        input_attrs = attrs if isinstance(attrs, dict) else {}
        # 合并优先级:默认属性 < 传入字典 < 关键字参数
        merged_attrs = {**self.DEFAULT_ATTRS, **input_attrs, **kwargs}
        for attr_name, attr_value in merged_attrs.items():
            setattr(self, attr_name, attr_value)

使用示例:

# 直接传入字典
obj3 = Example({"y": "dict_value", "z": 99})
# 混合传入字典与关键字参数
obj4 = Example({"x": "from_dict"}, y="from_kwargs")

方案优势

  • 高扩展性:新增默认属性只需在DEFAULT_ATTRS中添加键值对,无需修改初始化逻辑
  • 简洁性:避免了重复的条件判断和硬编码参数列表
  • 灵活性:支持任意数量的传入参数,包括预设默认值中没有的属性

内容的提问来源于stack exchange,提问作者Triceratops

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:55:25