【发布时间】:2010-04-05 08:42:24
【问题描述】:
有什么方法可以让类列表在 python 中表现得像一个集合?
基本上,我正在开发一款涉及字符串比较的软件,并且我有一个用于处理字符串的自定义类。因此,每个字符串都有一个类的实例。
因此,我有一个包含所有这些类的大列表。我希望能够像list[key] 一样访问它们,在这种情况下,键是类所基于的字符串(注意:一旦类被实例化,字符串就永远不会改变,所以它应该是可散列的) .
在我看来,我应该能够通过在课程中添加类似 __cmp__ 之类的东西来轻松地做到这一点,但要么我很迟钝(可能),要么我在文档中遗漏了一些东西。
基本上,我希望能够做这样的事情(Python 提示示例):
>>class a:
... def __init__(self, x):
... self.var = x
...
>>> from test import a
>>> cl = set([a("Hello"), a("World"), a("Pie")])
>>> print cl
set([<test.a instance at 0x00C866C0>, <test.a instance at 0x00C866E8>, <test.a instance at 0x00C86710>])
>>> cl["World"]
<test.a instance at 0x00C866E8>
谢谢!
编辑一些额外的调整:
class a:
... def __init__(self, x):
... self.var = x
... def __hash__(self):
... return hash(self.var)
...
>>> v = a("Hello")
>>> x = {}
>>> x[v]=v
>>> x["Hello"]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Hello'
>>> x["Hello"]
【问题讨论】:
-
一个 SET 使用索引,而不是键。字典似乎更符合您的要求,但您使用的是 a("Hello") 键的传递,并尝试使用不同的值——“Hello”来检索它。
-
您还应该为类 a 定义 __cmp__ 方法,该方法将在哈希值冲突的情况下调用。
-
请使用大写的类名。请从对象继承。像这样:
class A(object)。它会让我们更容易阅读,也更容易理解。