Skip to main content
 首页 » 编程设计

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

2025年05月04日17jpfss

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