如何控制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
相关产品推荐
相关产品推荐

