Comparing two objects

后端 未结 4 1732
误落风尘
误落风尘 2021-01-01 16:23

Is there any way to check if two objects have the same values, other than to iterate through their attributes and manually compare their values?

相关标签:
4条回答
  • 2021-01-01 16:47

    object1.__dict__ == object2.__dict__ Should be all you need, I think...

    Edit: vars(object1) == vars(object2) is perhaps a bit more pythonic, though @delnan makes a valid point about objects (e.g. ints) that don't have a __dict__. I disagree that a custom __eq__ is a better approach for simple cases, though... Sometimes it's not worth the effort to go beyond quick and dirty, if quick and dirty perfectly does what you need, i.m.h.o.

    0 讨论(0)
  • 2021-01-01 16:49

    To expound on delnan's answer:

    _NOTFOUND = object()
    
    class Rational(object):
        def __eq__(self, other):
            for attr in ['numerator', 'denominator']:
                v1, v2 = [getattr(obj, attr, _NOTFOUND) for obj in [self, other]]
                if v1 is _NOTFOUND or v2 is _NOTFOUND:
                    return False
                elif v1 != v2:
                    return False
            return True
    
    0 讨论(0)
  • 2021-01-01 16:53

    @Joe Kington's solutions works if there is a __dict__ (some objects, including builtins, don't have one) and __eq__ works for all values of both dicts (a badly written __eq__ mayraise exceptions etc). But it is horribly unpythonic. It doesn't even handle nominal subtypes properly... much less structural subtypes (i.e. types that you can use in place/for duck-typing). Do not do this.

    But usually you're better off with a hand-tailored __eq__ method that only compares some attributes that are significant. E.g. Rational should only compare numerator and denominator, nothing more.

    0 讨论(0)
  • 2021-01-01 16:57

    You can compare namedtuple directly.
    Otherwise you have to define either your own rich comparisons __eq__ and possibly __ne__
    or your own __cmp__

    see the datamodel for more info

    0 讨论(0)
提交回复
热议问题