Как печатать атрибуты класса без создания экземпляра объекта в Python?



Согласно этому сообщению, я могу перечислить переменную экземпляра, обратившись к 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)?
684   2  

2 ответов:

print(circle()) вызовет метод __str__ на экземпляре circle.

class circle:
  def __str__(self):
    pass

Как вы можете видеть здесь, вы определяете __str__ на экземпляре circle, используя def на родительском классе. Поэтому вы можете переопределить метод __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

Можно использовать член __dict__ самого объекта класса (возможно, отфильтровав ключи, начинающиеся с __).

class circle(object):
    radius = 3

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

Comments

    Ничего не найдено.