我正在尝试在Python中使用类似下面的代码对set
对象进行子类化,但我无法确定要使用的合理__repr__
定义。
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
我希望定义
__repr__
以便我可以获得以下输出:>>> Alpha('Salem', (1,2,3))
Alpha('Salem', set([1, 2, 3]))
然而,如果我不覆盖__repr__
,那么我得到的输出会忽略name
值...
>>> Alpha('Salem', (1,2,3))
Alpha([1, 2, 3])
…如果我重写__repr__
,那么我就无法直接访问集合中的值,除非创建一个新的集合实例:
class Alpha(set):
…
def __repr__(self):
return "%s(%r, %r)" % (self.__class__.__name__, self.name, set(self))
这个方法是可行的,但是为了__repr__
创建一个新的set实例,然后将其处理掉,对我来说似乎有些笨拙和低效。
是否有更好的方法来定义这种类的__repr__
?
编辑: 我想到了另一个解决方案:我可以将set存储在本地。这似乎比其他选项(为每次调用__repr__
创建和销毁某些东西或使用某种形式的字符串操作)更整洁,但对我来说仍然不理想。
class Alpha(set):
def __init__(self, name, s=()):
super(Alpha, self).__init__(s)
self.name = name
self._set = set(s)
def __repr__(self):
return "%s(%r, %r)" % (self.__class__.__name__, self.name, self._set)
__init__
,那么你调用super
的方式会导致无限递归。super
显式地接受一个类是因为它知道在方法解析顺序(MRO)中应该继续执行什么。传递Alpha
(如果这是3.x版本,则可以使用super()
- 它会以某种方式执行正确的操作)。 - user395760