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

时间:2018-03-27 06:04:53

标签: python class oop

根据这个post,我可以通过访问str(self.__dict__)来枚举实例变量,但我无法弄清楚如何使用类变量来实现这一点。

这就是我想要避免

# I would like to print out class attributes by overriding `__str__` for that class.
class circle(object):
    radius = 3
    def __str__(self):     # I want to avoid instantiation like this.
        return str(circle.radius)

print(circle())    # I want to avoid instantiation. why can't I just print(circle)?

2 个答案:

答案 0 :(得分:4)

您可以使用类对象本身的__dict__成员(可能过滤掉以__开头的键)。

class circle(object):
    radius = 3

print({k: v for k,v in circle.__dict__.items() if not k.startswith('__')}) # prints {'radius': 3}

答案 1 :(得分:4)

print(circle())会在圈子实例上调用__str__方法。

class circle:
  def __str__(self):
    pass

正如您在此处所见,您可以通过在父类上使用def来定义圆形实例上的__str__。因此,您可以使用ITS parent覆盖CLASS上的__str__方法。

 class circle(object):
     class __metaclass__(type):
         def __str__(cls):
             return str(cls.__dict__)
     radius = 3

现在,print circle会给你

{'__module__': '__main__', '__metaclass__': <class '__main__.__metaclass__'>, 'radius': 3, '__dict__': <attribute '__dict__' of 'circle' objects>, '__weakref__': <attribute '__weakref__' of 'circle' objects>, '__doc__': None}

编辑python3元类语法

class meta(type):
  def __str__(cls):
    return str(cls.__dict__)

class circle(object, metaclass=meta):
  radius = 3