我可以为类而不是实例定义__repr__吗?

Wai*_*ung 11 python metaprogramming metaclass

我可以__repr__为类而不是实例定义一个吗?例如,我正在尝试这样做

class A(object):
    @classmethod
    def __repr__(cls):
        return 'My class %s' % cls
Run Code Online (Sandbox Code Playgroud)

我得到的是

In [58]: a=A()

In [59]: a
Out[59]: My class <class '__main__.A'>

In [60]: A
Out[60]: __main__.A
Run Code Online (Sandbox Code Playgroud)

我试图让第60行的输出看起来像"我的A类",而不是实例a.我想这样做的原因是我使用Python的元类生成了很多类.而且我想要一种更易读的方法来识别类而不是股票代理.

Mic*_*ior 19

您需要__repr__在元类上定义.

class Meta(type):
    def __repr__(cls):
        return 'My class %s' % cls.__name__

class A(object):
    __metaclass__ = Meta
Run Code Online (Sandbox Code Playgroud)

__repr__返回对象实例的表示.因此,通过定义__repr__A,你指定你想要的repr(A())样子.

要定义类的表示,您需要定义如何表示实例type.在这种情况下,请替换为您需要定义type的自定义元类__repr__.

>> repr(A)
My class A
Run Code Online (Sandbox Code Playgroud)

如果你想__repr__为每个类定义一个自定义,我不确定是否有一个特别干净的方法.但你可以做这样的事情.

class Meta(type):
    def __repr__(cls):
        if hasattr(cls, '_class_repr'):
            return getattr(cls, '_class_repr')()
        else:
            return super(Meta, cls).__repr__()

class A(object):
    __metaclass__ = Meta

    @classmethod
    def _class_repr(cls):
        return 'My class %s' % cls.__name__

class B(object):
    __metaclass__ = Meta
Run Code Online (Sandbox Code Playgroud)

然后,您可以按类进行自定义.

>> repr(A)
My class A
>> repr(B)
<__main__.B object at 0xb772068c>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,在Python 3中,`__ metaclass__`没有特殊含义,相反应该使用`class A(metaclass = Meta)`. (4认同)