[Armin] > > ... is that the __adapt__() and __conform__() methods should work just > > like all other special methods for new-style classes. The confusion > > comes from the fact that the reference implementation doesn't do that. > > It should be fixed by replacing: > > > > conform = getattr(type(obj), '__conform__', None) > > > > with: > > > > for basecls in type(obj).__mro__: > > if '__conform__' in basecls.__dict__: > > conform = basecls.__dict__['__conform__'] > > break > > else: > > # not found > > > > and the same for '__adapt__'. > > > > The point about tp_xxx slots is that when implemented in C with slots, you > > get > > the latter (correct) effect for free. This is how metaconfusion is avoided > > in > > post-2.2 Python. Using getattr() for that is essentially broken. Trying to > > call the method and catching TypeErrors seems pretty fragile -- e.g. if you > > are calling a __conform__() which is implemented in C you won't get a Python > > frame in the traceback either.
[Thomas] > I'm confused. Do you mean that > > getattr(obj, "somemethod")(...) > > does something different than > > obj.somemethod(...) > > with new style class instances? Doesn't getattr search the __dict__'s > along the __mro__ list? No, he's referring to the (perhaps not widely advertised) fact that obj[X] is not quite the same as obj.__getitem__(X) since the explicit method invocation will find obj.__dict__["__getitem__"] if it exists but the operator syntax will start the search with obj.__class__.__dict__. -- --Guido van Rossum (home page: http://www.python.org/~guido/) _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com