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

如何控制Python类(非类实例)的打印输出以显示类属性?

如何控制Python类本身的打印输出?

问题场景

你有一个包含类属性的Python类,直接打印类时只会输出类的名称,无法看到属性值:

class CONFIG:
    ONE = 1
    TWO = 2

print(CONFIG)  # 输出: <class '__main__.CONFIG'>

对于类实例,我们可以通过定义__repr__()方法控制打印格式,但类本身(非实例)的打印行为该如何控制?是否存在类级别的__repr__等效方法?


核心解决方案:自定义元类

Python中所有类都是type的实例,要修改类本身的打印行为,需要自定义元类并在元类中实现__repr__方法。当你打印类时,实际调用的是其元类的__repr__方法。

示例代码:

class ConfigMeta(type):
    def __repr__(cls):
        # 过滤掉类的特殊属性(以__开头的),只保留自定义类属性
        attrs = {k: v for k, v in vars(cls).items() if not k.startswith('__')}
        return f"{cls.__name__}({attrs})"

class CONFIG(metaclass=ConfigMeta):
    ONE = 1
    TWO = 2

print(CONFIG)  # 输出: CONFIG({'ONE': 1, 'TWO': 2})

替代方案

如果不想用元类,也可以采用以下几种方式:

1. 编写遍历类属性的函数

手动编写函数来提取并打印类的自定义属性:

def print_class_attrs(cls):
    attrs = {k: v for k, v in vars(cls).items() if not k.startswith('__')}
    print(f"{cls.__name__}({attrs})")

class CONFIG:
    ONE = 1
    TWO = 2

print_class_attrs(CONFIG)  # 输出: CONFIG({'ONE': 1, 'TWO': 2})

2. 实例化类并定义实例的__repr__

虽然类属性属于类本身,但可以实例化类后,在实例的__repr__中引用类属性:

class CONFIG:
    ONE = 1
    TWO = 2

    def __repr__(self):
        return f"CONFIG(ONE={self.ONE}, TWO={self.TWO})"

print(CONFIG())  # 输出: CONFIG(ONE=1, TWO=2)

3. 改用Enum或SimpleNamespace替代类

如果只是用来存储配置常量,用Enum或types.SimpleNamespace会更简洁,且自带友好的打印格式:

使用Enum:

from enum import Enum

class CONFIG(Enum):
    ONE = 1
    TWO = 2

print(CONFIG)  # 输出: <enum 'CONFIG'>
# 若要查看所有枚举项,可以遍历打印
for item in CONFIG:
    print(f"{item.name}: {item.value}")
# 输出:
# ONE: 1
# TWO: 2

使用SimpleNamespace:

from types import SimpleNamespace

CONFIG = SimpleNamespace(ONE=1, TWO=2)
print(CONFIG)  # 输出: namespace(ONE=1, TWO=2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:50:31