On Oct 6, 7:16 am, Christian Heimes <[EMAIL PROTECTED]> wrote: > Terry Reedy wrote: > > In 3.0, the test returns true because function attributes only get > > wrapped when bound. In the meanwhile, " 'object' in repr(X.__lt__)" > > should do it for you. > > This session should give you some hints how to archive your goal :) > Have fun! > > >>> import types > >>> class A(object): > ... def __lt__(self): > ... pass > ... > >>> isinstance(A.__lt__, types.MethodType) > True > >>> isinstance(A.__gt__, types.MethodType) > False > > >>> type(A.__lt__) > <type 'instancemethod'> > >>> type(A.__gt__) > <type 'method-wrapper'> > >>> type(A.__str__) > <type 'wrapper_descriptor'> > >>> type(A.__new__) > <type 'builtin_function_or_method'> > > >>> A.__lt__.im_func > <function __lt__ at 0x7f03f9298500> > >>> A.__lt__.im_func == A.__lt__.im_func > True > >>> A.__gt__.im_func > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > AttributeError: 'method-wrapper' object has no attribute 'im_func'
However - I need to detect whether a method is inherited from *object*. All those differences you have shown behave identically if the class inherits from 'int'. I am trying to detect explicit implementation of comparison methods - so there is a big difference between inheriting from int and inheriting from object (meaningful comparison methods existing on one and not the other). What I went for in the end: import sys as _sys if _sys.version_info[0] == 3: def _has_method(cls, name): for B in cls.__mro__: if B is object: continue if name in B.__dict__: return True return False else: def _has_method(cls, name): for B in cls.mro(): if B is object: continue if name in B.__dict__: return True return False See this page for why I needed it: http://www.voidspace.org.uk/python/weblog/arch_d7_2008_10_04.shtml#e1018 Michael -- http://www.ironpythoninaction.com/ -- http://mail.python.org/mailman/listinfo/python-list