On Sun, 25 Dec 2011 23:32:41 +1100, Chris Angelico wrote: > On Sun, Dec 25, 2011 at 11:10 PM, Steven D'Aprano > <steve+comp.lang.pyt...@pearwood.info> wrote: >> class Point: # An abstract class. >> def intersect(self, other): >> blah; blah; blah >> return Point(x, y) # No, wrong, bad!!! Don't do this. >> >> Instead: >> >> return self.__class__(x, y) # Better. > > This would work if you were dealing with the intersection of two points, > but how do you use that sort of trick for different classes?
There's nothing in the above that assumes that other has the same type as self. It's just that the type of other is ignored, and the type of self always wins. I find that a nice, clear rule: x.intersection(y) always returns a point with the same type as x. If you want a more complicated rule, you have to code it yourself: def intersection(self, other): if issubclass(type(other), type(self)): kind = type(other) elif issubclass(type(self), type(other)): kind = AbstractPoint elif other.__class__ is UserPoint: kind = UserPoint elif today is Tuesday: kind = BelgiumPoint else: kind = self.__class__ return kind(x, y) -- Steven -- http://mail.python.org/mailman/listinfo/python-list