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

时间:2017-02-19 12:32:27

标签: python class debugging instance

我有一堆类,我正在使用它作为单例/枚举/词典键,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 distribution函数中的show_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这样的输出肯定会出现这种情况。

3 个答案:

答案 0 :(得分:3)

你是正确的,你必须覆盖类的<div>类;您无需修改​​<p>What the image first looks like:</p> <img src="https://upload.wikimedia.org/wikipedia/en/6/69/Stop_sign(standard).svg" width="140" height="150"> <p>What the image looks like after removing some of it by putting it inside the div:</p> <div style="overflow: hidden; padding: 0px; width: 140px; height: 120px;"> <img src="https://upload.wikimedia.org/wikipedia/en/6/69/Stop_sign(standard).svg" width="140" height="150"> </div> <p>But... I would like to remove some of the top of the stop sign also - not just the bottom!</p>子类 __repr__即可创建new metaclass

type

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

type

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

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

class Side(metaclass=SimpleRepr): pass 的子类也继承了元类:

class Side(object):
    __metaclass__ = SimpleRepr

但是,您可以使用实例:

Side

答案 1 :(得分:1)

为什么不使用带有 repr

的枚举
from enum import Enum

class Side(Enum):
  Left = 'Left'
  Right = 'Right'

  def __repr__(self):
    return self.name


distribution = { Side.Left: 3, Side.Right: 7 }

print distribution  # {Right: 7, Left: 3}

答案 2 :(得分:0)

你发现这个困难的原因是,这真是一种奇怪的类使用。您是否考虑过只有一个班级,Side,并且左右都是实例?

class Side(object):
    def __init__(self, direction):
        self.direction = direction

    def __repr__(self):
        return self.direction

left = Side(left)
right = Side(right)