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)