On Mon, Oct 12, 2009 at 4:03 PM, Robert Kern <robert.k...@gmail.com> wrote: > On 2009-10-12 15:45 PM, Peng Yu wrote: >> >> Hi, >> >> I'm wondering what is the general way to define __hash__. I could add >> up all the members. But I am wondering if this would cause a >> performance issue for certain classes. > > Unless if you are very familiar with the math of hash functions, I don't > recommend that you try to implement one directly. Instead, make a tuple of > the hashable content of your class and return the result of calling hash() > on that tuple. Be sure to make your equality comparison do the right thing. > > class A(object): > def __init__(self, a, b): > self.a = a > self.b = b > > def _key(self): > # I include the name of the class so as to differentiate between other > # classes that might also have a _key() method. If you have several > classes > # or subclasses that are allowed to compare equal to each other, use some > # other common string here. > return (type(self).__name__, a, b) > > def __hash__(self): > return hash(self._key()) > > # Coincidentally, the _key() method can usually be reused for comparisons. > # I recommend doing this for the equality comparisons, at least, when you > can > # because of the requirement that two items that compare equal must have > the > # same hash value. > def __eq__(self, other): > return self._key() == other._key() > > def __ne__(self, other): > return not (self == other) > > ...
Do I need to define other 4 comparison operators besides __eq__ and __ne__? -- http://mail.python.org/mailman/listinfo/python-list