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

如何在Python中简洁地将类属性赋值为该类的实例?

解决方案:在Color类中简洁定义预设颜色并保持类型安全

针对你遇到的类内部自引用报错、代码重复问题,以下几种方案可以实现简洁定义预设颜色,同时保留类型安全和可读性:

方案一:使用类装饰器注入预设颜色

通过装饰器在类定义完成后批量添加预设颜色属性,避免类未定义时的自引用问题:

from __future__ import annotations

def add_preset_colors(cls):
    preset_colors = {
        "RED": (255, 0, 0),
        "GREEN": (0, 255, 0),
        "BLUE": (0, 0, 255),
        "WHITE": (255, 255, 255),
        "BLACK": (0, 0, 0)
    }
    for name, rgb in preset_colors.items():
        setattr(cls, name, cls(*rgb))
    return cls

@add_preset_colors
class Color:
    RED: Color
    GREEN: Color
    BLUE: Color
    WHITE: Color
    BLACK: Color

    def __init__(self, r: int, g: int, b: int) -> None:
        self.r = r
        self.g = g
        self.b = b
  • from __future__ import annotations 让类型注解中的Color无需加引号,提升可读性(Python 3.7+支持)
  • 装饰器集中管理预设颜色的RGB值,只需维护一个字典即可,减少重复代码

方案二:类定义后批量赋值简化代码

如果不想使用装饰器,可以通过循环批量完成类属性赋值,避免重复的Color.XXX = Color(...)写法:

from __future__ import annotations

class Color:
    RED: Color
    GREEN: Color
    BLUE: Color
    WHITE: Color
    BLACK: Color

    def __init__(self, r: int, g: int, b: int) -> None:
        self.r = r
        self.g = g
        self.b = b

# 批量赋值预设颜色
preset_colors = {
    "RED": (255, 0, 0),
    "GREEN": (0, 255, 0),
    "BLUE": (0, 0, 255),
    "WHITE": (255, 255, 255),
    "BLACK": (0, 0, 0)
}
for name, rgb in preset_colors.items():
    setattr(Color, name, Color(*rgb))
  • 类型注解保留,保证IDE和类型检查工具能识别属性类型
  • 字典集中管理预设颜色,修改和扩展更方便

方案三:使用元类自动添加预设颜色

元类可以在类创建的过程中自动注入属性,适合需要底层控制的场景:

from __future__ import annotations

class ColorMeta(type):
    def __new__(cls, name, bases, attrs):
        # 创建Color类对象
        new_class = super().__new__(cls, name, bases, attrs)
        # 注入预设颜色
        preset_colors = {
            "RED": (255, 0, 0),
            "GREEN": (0, 255, 0),
            "BLUE": (0, 0, 255),
            "WHITE": (255, 255, 255),
            "BLACK": (0, 0, 0)
        }
        for color_name, rgb in preset_colors.items():
            setattr(new_class, color_name, new_class(*rgb))
        return new_class

class Color(metaclass=ColorMeta):
    RED: Color
    GREEN: Color
    BLUE: Color
    WHITE: Color
    BLACK: Color

    def __init__(self, r: int, g: int, b: int) -> None:
        self.r = r
        self.g = g
        self.b = b
  • 元类的__new__方法在类创建时执行,此时已经可以访问到完整的类对象,避免自引用问题
  • 预设颜色的定义和类的逻辑分离,结构更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:35:12