Методы представления классов Python - PullRequest
5 голосов
/ 23 февраля 2011

Я знаю, что методы __repr__ и __str__ существуют для формального и неформального представления экземпляров классов. Но существует ли эквивалент и для объектов класса, так что, когда объект класса печатается, может быть показано его хорошее представление?

>>> class Foo:
...     def __str__(self):
...         return "instance of class Foo"
...
>>> foo = Foo()
>>> print foo
instance of class Foo
>>> print Foo
__main__.Foo

Ответы [ 4 ]

6 голосов
/ 23 февраля 2011

Когда вы вызываете print(foo), вызывается метод foo __str__. __str__ встречается в классе foo, то есть Foo.

Аналогично, когда вы вызываете print(Foo), вызывается метод Foo * __str__. __str__ встречается в классе Foo, который обычно type. Вы можете изменить это, используя метакласс:

class FooType(type):
    def __str__(cls):
        return 'Me a Foo'
    def __repr__(cls):
        return '<Foo>'

class Foo(object):
    __metaclass__=FooType
    def __str__(self):
        return "instance of class Foo"

print(Foo)
# Me a Foo

print(repr(Foo))
# <Foo>
1 голос
/ 23 февраля 2011

Вы могли бы сделать это с метаклассом, но AFAIK, для обычных классов нет общего решения.

Если это только ваши собственные классы, вы можете принять стандарт кодирования, включающий конкретную переменную классас вашими метаданными, то есть:

class Whatever(object):
    classAuthor = "me"
    classCreated = "now"

Или, если вы используете питона, который поддерживает декораторы классов, вы можете использовать декоратор, чтобы автоматически аннотировать его или обеспечить наличие метаданных.

Но ... может быть, вы просто хотите AClass.__name__?

0 голосов
/ 23 февраля 2011

Вы не можете использовать __repr__ или __str__ для типа класса, но вы можете использовать строку документации для представления информации о классе

>>> class Foo:
...     """Foo's description"""
...     def __str__(self):
...         return "instance of class Foo"
... 
>>> foo = Foo()
>>> print foo
instance of class Foo
>>> print Foo.__doc__
Foo's description
>>> Foo.__doc__
"Foo's description"
0 голосов
/ 23 февраля 2011

На мой взгляд, хорошо, что вы не можете создать пользовательскую строку repr для классов; цель класса - создать экземпляры этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...