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

Python中如何不实例化对象就打印类属性?

解决直接打印类输出类变量的问题

嘿,我完全懂你的痛点!你想直接打印类本身就能输出它的类变量,而不是非得先实例化一个对象,对吧?原来的__str__方法是实例方法——它需要绑定到类的实例上才能调用,所以你才不得不写print(circle()),而直接打印circle的时候,Python会用默认的类字符串表示(比如<class '__main__.circle'>)。

那怎么让直接打印类就能输出我们想要的类变量信息呢?其实很简单,我们可以给类定义一个类级别的__str__方法,用@classmethod装饰器来实现:

方法一:自定义类的__str__(仅显示当前类定义的类变量)

class Circle(object):
    radius = 3
    
    @classmethod
    def __str__(cls):
        # 过滤掉Python内置的特殊属性(比如__module__、__doc__),只保留我们定义的类变量
        class_variables = {key: value for key, value in cls.__dict__.items() if not key.startswith('__')}
        return f"Circle类的属性: {class_variables}"

# 现在直接打印类就可以了!不用实例化
print(Circle)

运行这段代码,你会得到输出:Circle类的属性: {'radius': 3},完全符合你的需求!

方法二:包含继承来的类变量(如果需要)

如果你的类继承了父类,想把父类的类变量也一起显示出来,可以用dir(cls)来遍历所有属性,再过滤掉方法和特殊属性:

class Shape(object):
    color = "red"

class Circle(Shape):
    radius = 3
    
    @classmethod
    def __str__(cls):
        all_class_vars = {}
        for attr_name in dir(cls):
            # 跳过特殊属性
            if attr_name.startswith('__'):
                continue
            attr_value = getattr(cls, attr_name)
            # 只保留非方法的属性(也就是类变量)
            if not callable(attr_value):
                all_class_vars[attr_name] = attr_value
        return f"Circle类的所有属性: {all_class_vars}"

print(Circle)

这段代码会输出:Circle类的所有属性: {'color': 'red', 'radius': 3},把父类的color也包含进来了。

补充:类变量的存储位置

你提到用str(self.__dict__)枚举实例变量,而类变量其实存储在类本身的__dict__里(也就是Circle.__dict__),所以我们通过cls.__dict__就能直接访问到当前类定义的所有类变量,再过滤掉特殊属性就得到了我们需要的内容。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:17:15