Python - 使用键访问列表中的类

标签 python class

有什么方法可以使类列表的行为类似于 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/

相关文章:

python - 如何逐字读取文件

python - 为什么使用不同类型的 session 会影响变量是否在 tensorflow 中初始化?

具有构造函数定义但没有实现代码的c++类?

java - 父类(super class)对象还是子类对象?为什么?

C++ 错误 C2228

c++ - 主体为空的类是不完整类型吗?

python - BeautifulSoup 不会返回页面上的所有元素

python - Scikit-learn 仅适用于 python 2,不适用于 python 3

头文件中的 C++ 类定义

c++ - 关于在 boost.python 中将 Python 二进制文件转换为 C++ 二进制文件的错误