当前位置: 首页 > 面试题库 >

如何使我的课程可用作字典键?

裴欣然
2023-03-14
问题内容

class A():
def init(self, data=’‘):
self.data = data

   def __str__(self):
       return str(self.data)

d = {}  
elem = A()  
d[elem] = 'abc'

elem2 = A()
print d[elem2]    # KeyError  
# actually elem2! was used not elem

我该如何正确执行呢?

我试图获取d[elem2](不是elem)另一个具有相同内容的A()BUT实例。


问题答案:

答案是可以的,您需要重新定义__hash__()

>>> class A(object):
...   def __init__(self, data=''):
...     self.data = data
...   def __eq__(self, another):
...     return hasattr(another, 'data') and self.data == another.data
...   def __hash__(self):
...     return hash(self.data)
... 
>>> a1, a2, a3 = A('foo'), A('foo'), A('bar')
>>> d = {a1: 'foo'}
>>> d[a1]
'foo'
>>> d[a2]
'foo'
>>> d[a3]
Traceback (most recent call last):
  File "", line 1, in 
KeyError: __main__.A object at 0x927d0>

如另一条注释中所述,默认实现__hash__只是简单的标识,因此,如果要使其更复杂,则需要显式定义。



 类似资料:
  • 问题内容: 我有一个只包含字段而没有方法的类,如下所示: 这可以很容易地翻译成字典。该类对于将来的添加更加灵活,使用可以更快。那么使用dict会有好处吗?字典会比全班更快吗?并且比具有插槽的课程快吗? 问题答案: 你为什么要把它当作字典?有什么好处?如果您以后要添加一些代码,会发生什么?您的代码会去哪儿? 类用于捆绑相关数据(通常是代码)。 字典用于存储键- 值关系,其中通常键都是同一类型,并且所

  • 问题内容: 我需要实现一个可哈希的字典,因此我可以将一个字典用作另一个字典的键。 但是我从一位同事那里得到了一个通知,说“它并不是真正不变的,因此并不安全。您可以使用它,但是它的确使我感到自己像个可悲的熊猫。 因此,我开始环顾四周以创建一个不可变的对象。我没有必要将“ key-dict”与另一个“ key-dict”进行比较。它的唯一用途是用作另一本词典的键。 我想出了以下几点: 我使用以下工具测

  • 问题内容: 我想知道我能否以某种方式使用x,y对作为字典的键 但是我得到了错误: 和错误: 那么..我们怎样才能使其符合标准? 问题答案: 的定义是,即密钥的类型必须符合协议。但是语言指南告诉我们协议可以被类,结构和枚举所采用,即不能被元组所采用。因此,元组不能用作键。 一种解决方法是定义一个包含两个Ints的可哈希结构类型(或您要放入元组的任何内容)。

  • 问题内容: 我对Python不太熟悉。所以我在编码时遇到了一些问题。 在 功能块中* 使用 功能名称 是很正常的,例如: * 但是,当我尝试在 类块中* 使用 类名 时,出现了问题: * 尽管下面的代码可以: 然后,我使用statement调试这两个代码。我发现 类块 中的全局变量dict不包含,而 功能块 中的全局变量dict 包含了它。 因此,似乎类名称绑定是在执行 类块 之后,在执行 功能块

  • 问题内容: 说我有自己的课程 它具有一些属性和方法。它不实现等于,不实现hashCode。 一旦我们调用equals和hashCode,默认的实现是什么?从对象类?那是什么 默认值等于如何工作?默认的hashCode将如何工作,返回什么?==只会检查它们是否引用同一个对象,因此很容易,但是equals()和hashCode()方法呢? 问题答案: 是的,默认实现是Object的实现(通常来说;如果

  • 问题内容: 我以为只有不可变的对象才可以是字典键,但是上面的对象是可变的。 问题答案: 具有hash方法的任何对象都可以是字典键。对于您编写的类,此方法默认返回基于id(self)的值,并且如果相等性不是由这些类的标识决定的,则将它们用作键可能会让您感到惊讶: 在2.6版中进行了更改:__hash__现在可以设置为None,以将类实例明确标记为不可哈希。[ hash ]