Python 2.6 / 3.0: Determining if a method is inherited

MRAB google at mrabarnett.plus.com
Mon Oct 6 02:13:28 CEST 2008


Fuzzyman wrote:
> Hello all,
>
> I may well be being dumb (it has happened before), but I'm struggling
> to fix some code breakage with Python 2.6.
>
> I have some code that looks for the '__lt__' method on a class:
>
> if hasattr(clr, '__lt__'):
>
> However - in Python 2.6 object has grown a default implementation of
> '__lt__', so this test always returns True.
>
> >>> class X(object): pass
> ...
> >>> X.__lt__
> <method-wrapper '__lt__' of type object at 0xa15cf0>
> >>> X.__lt__ == object.__lt__
> False
>
> So how do I tell if the X.__lt__ is inherited from object? I can look
> in the '__dict__' of the class - but that doesn't tell me if X
> inherits '__lt__' from a base class other than object. (Looking inside
> the method wrapper repr with a regex is not an acceptable answer...)
>
> Some things I have tried:
>
> >>> X.__lt__.__self__
> <class '__main__.X'>
> >>> dir(X.__lt__)
> ['__call__', '__class__', '__cmp__', '__delattr__', '__doc__',
> '__format__', '__getattribute__', '__hash__', '__init__', '__name__',
> '__new__', '__objclass__', '__reduce__', '__reduce_ex__', '__repr__',
> '__self__', '__setattr__', '__sizeof__', '__str__',
> '__subclasshook__']
> >>> X.__lt__.__func__
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> AttributeError: 'method-wrapper' object has no attribute '__func__'
>
>
> Hmmm... I can get this working with Python 2.6 with:
>
> if '__lt__' in dir(cls):
>
> The default implementation of '__lt__' doesn't appear in the dir of
> classes. However this fails with Python 3 where the default
> implementation *does* appear in the output of 'dir'. Any suggestions?
>
Methods are objects. How do you know if two references refer to the
same object? You use "is":

X.__lt__ is object.__lt__



More information about the Python-list mailing list