On Sat, Apr 11, 2015 at 11:44:23PM +1000, Chris Angelico wrote:
Every document I've ever seen has taken one of two attitudes toward old-style classes. Either they should be considered deprecated, and every class you define should explicitly subclass something; or they're a really cool micro-optimization with a few fancy flexibilities that new-style classes don't have, but which come up only in the most obscure cases.
I wouldn't necessarily believe that classic classes are still faster than new-style classes. I think it was certainly true back in the 2.2 and 2.3 days, but probably not in 2.7. In any case, I'd like to see the benchmarks demonstrating a speed advantage to classic classes before believing that they are an optimization in practice. As far as I can see, the only things classic classes can do that new-style classes don't are: (1) Per-instance overriding of dunder methods on the instance. (I'm sure there's a Design Pattern name for this, but I can never remember it.) You can override regular methods for a particular instance by giving it an instance attribute that is a bound method: class Parrot: def speak(self): return "Want a cracker!" polly = Parrot() polly.speak = types.MethodType(lambda self: "Who's a pretty boy?", polly) but this doesn't work with dunders in new-style classes. In classic classes, it does. (2) Automatic delegation including dunder methods. Both of these may be important, but if you are migrating to 3.x you are going to lose them anyway, so you have to deal with it somehow. (Probably by crying a lot.) -- Steve