gpt4 book ai didi

python - 定义类(不是实例)的 repr()

转载 作者:行者123 更新时间:2023-11-28 21:43:21 26 4
gpt4 key购买 nike

我有一堆类用作单例/枚举/字典键,e。 G。像这样:

class Side(object): pass

class Left(Side): pass
class Right(Side): pass

def show_state(distribution):
print "left is", distribution[Left]
print "right is", distribution[Right]

distribution = { Left: 3, Right: 7 }
show_state(distribution)

这对我来说很好用。但是我有时会遇到调试输出的小问题。通常我只使用 print为此,如 print distributionshow_state()功能。我希望有这样的输出:

{ Left: 3, Right: 7 }

但是当我对这些类执行此操作时,它们会以如下形式给出:

{<class '__main__.Right'>: 7, <class '__main__.Left'>: 3}

我试图覆盖 __repr__()我的类的方法来实现这一点,但是当我这样做时,它只会影响我的类的实例(我从未创建过)。我尝试使用 @classmethod@staticmethod但没有任何效果。

我假设我打印的是 Left因此是 <type 'type'> 的一个实例,所以我必须重写 __repr__() type 的方法不幸的是,这是不可变的类。

我可以使用任何其他技巧来 print distribution会打印我想要的吗?

顺便说一句,根据文档,__repr__()方法应该返回一些东西,Python 解析器会再次将其变成一个相等的对象;这绝对不是像 <class '__main__.Right'> 这样的输出的情况但肯定会像 Right 这样的输出.

最佳答案

你是对的,你必须覆盖类类型的 __repr__;您不需要编辑 type,您可以子类 type 来创建 new metaclass :

class SimpleRepr(type):
def __repr__(cls):
return cls.__name__

然后将其用作您的类元类;假设您使用的是 Python 3:

class Side(metaclass=SimpleRepr): pass

或者如果您仍在使用 Python 2:

class Side(object):
__metaclass__ = SimpleRepr

Side 的子类也继承元类:

>>> class SimpleRepr(type):
... def __repr__(cls):
... return cls.__name__
...
>>> class Side(metaclass=SimpleRepr): pass
...
>>> class Left(Side): pass
...
>>> class Right(Side): pass
...
>>> { Left: 3, Right: 7 }
{Left: 3, Right: 7}

但是,您可以只使用实例:

class Side(object):
__slots__ = ('name',)
def __init__(self, name):
self.name = name
def __repr__(self):
return self.name

Left = Side('Left')
Right = Side('Right')

关于python - 定义类(不是实例)的 repr(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42327233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com