5

我知道这些方法__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

4 回答 4

6

当您调用 时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>
于 2011-02-23T04:22:42.810 回答
1

您可能可以使用元类来做到这一点,但是 AFAIK,普通类没有通用解决方案。

如果它只是您自己的类,您可以采用在元数据中包含特定类变量的编码标准,即:

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

或者,如果您使用支持类装饰器的 python,您可以使用装饰器自动为您注释它或强制元数据存在。

但是......也许你只是想要AClass.__name__

于 2011-02-23T02:07:20.413 回答
0

在我看来,你不能repr为类创建自定义字符串是件好事。类的重点是创建该类的实例。

于 2011-02-23T01:38:17.117 回答
0

您不能在类类型上使用__repr__or但您可以使用文档字符串来显示有关该类的信息__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"
于 2011-02-23T02:18:35.663 回答