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