2

我试图了解如何在 Python 中实现对象的列表或散列。更具体地说,在这个问题中,这是我能得到的最接近的,我通过这样做看到了这一点:

class MyClass(object):

def __init__(self):
    self.numbers = [1,2,3,4,54]

def __contains__(self, key):
    return key in self.numbers

>>> m = MyClass()
>>> 54 in m
True

我可以直接在类中使用运算符来检查其中的属性

我的问题是这个问题的延伸。假设我有一个 MyClass 对象的列表或哈希,即:

list = [m1,m2,m3]
hash = {m1,m2,m3}

我想使用类似的东西:

if 54 in list: 
   #do something
if 54 in hash: 
   #do something

需要在 MyClass 中定义哪些方法才能使 in 运算符起作用?我不确定 in 做了什么(如果是 == 则需要 __eq 或其他东西)。如果您碰巧知道在这种情况下如何使 .index() 工作,我也将不胜感激。

编辑:对不起,最初的问题令人困惑。我希望我说清楚了。我正在尝试查找属于该类的属性,例如另一个问题的原始示例。但现在我试图在列表或哈希中这样做。从某种意义上说,我希望通过询问一个元素是否在列表中,它询问它是否在列表的每个元素中。我不确定是通过在列表或哈希中使用运算符来做到这一点,还是使用 == 进行比较。

谢谢你。

4

2 回答 2

4

in测试包含时,它会根据您的自定义类型检查是否相等。

换句话说,ob in some_sequence可以看成:

any((ob is contained_ob or ob == contained_ob) for contained_ob in some_sequence)

两个自定义类ob1ob2测试相等,如果:

  1. 它们是相同的,ob1 is ob2是True。它们是同一个对象。
  2. 如果ob1__eq__方法,则ob1.__eq__(ob2)进行测试。
  3. 如果ob1没有这种方法,但ob2.__eq__() 确实存在则ob2.__eq__(ob1)尝试。

您还可以定义__ne__()and/or__cmp__()方法使事情变得更复杂一些,但您通常希望避免在自定义类型中过多地玩弄这个。

于 2013-04-17T17:27:21.653 回答
0

As @MartijnPieters said, you should overload the __eq__() method. I'm not sure what you mean by the hash/dictionary example you gave.

class MyClass(object):

    def __init__(self):
        self.numbers = [1,2,3,4,54]

    def __contains__(self, key):
        return key in self.numbers

    def __eq__(self, other):
        if other in self.numbers:
            return True
        else:
            return False


m1 = MyClass()
m2 = MyClass()
m3 = MyClass()

test1 = 54 in [m1, m2, m3]
print test1
#True
test2 = 666 in [m1, m2, m3]
print test2
#False
于 2013-04-17T17:46:49.200 回答