Ian Kelly wrote: >> Extending this to wrap methods of classes is also left as an exercise. >> (Hint: don't subclass. Search the ActiveState Python recipes for >> "automatic delegation" by Alex Martelli.) > > Do you mean this one? > > http://code.activestate.com/recipes/52295-automatic-delegation-as-an- alternative-to-inherita/ > > That's based on old-style classes. With new-style classes it fails to > delegate dunder methods like __str__. That recipe should be considered > obsolete.
I'm aware of the problem with dunder methods. But that's not an insurmountable problem, if you need your delegation recipe to support dunders (and you may not), it's fiddly and annoying to do so, but not impossible. There are at least two approaches: - manually delegate to the dunders that you care about with hand- written dunder methods: def __str__(self): return type(self.proxied_object).__str__(self.proxied_object) # or for people who prefer simplicity over correctness # return self.proxied_object.__str__() - write a decorator which inspects the class and automatically adds explicit dunders for you. (There's a recipe on ActiveState for that one too.) Regardless of whether you start with Alex's recipe or not, the idea is to make a proxy for the pymongo classes, and delegate to it rather than subclass or re-invent the wheel. That's a basic design pattern, and if dunders are a problem in Python that Ruby or Java doesn't have, oh well, life wasn't meant to be easy. -- Steven -- https://mail.python.org/mailman/listinfo/python-list