Как печатать атрибуты класса без создания экземпляра объекта в 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)?
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