有什么方法可以使类列表的行为类似于 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"]
最佳答案
只需编写一个行为有点像映射的类:
class ClassDict(object):
def __init__(self):
self.classes = {}
def add(self, cls):
self.classes[cls.__name__] = cls
def remove(self, cls):
if self.classes[cls.__name__] == cls:
del self.classes[cls.__name__]
else:
raise KeyError('%r' % cls)
def __getitem__(self, key):
return self.classes[key]
def __repr__(self):
return 'ClassDict(%s)' % (', '.join(self.classes),)
class C(object):
pass
class D(object):
pass
cd = ClassDict()
cd.add(C)
cd.add(D)
print cd
print cd['C']
关于Python - 使用键访问列表中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2577549/