class rec1(object): def __new__(cls, counter): if counter > 0: rec1.__new__(rec1, counter-1) return object.__new__(cls) class rec2(object): class __metaclass__(type): def __call__(cls, counter): if counter > 0: rec2.__call__(counter-1) return object.__new__(cls) class rec3(object): def __new__(cls, counter): self = object.__new__(cls) self.__init__(counter) return self def __init__(self, counter): if counter > 0: rec3.__new__(rec3, counter-1) class rec4(object): def __new__(cls, counter): if counter > 0: rec4.__call__(counter-1) return object.__new__(cls) class rec5(object): def __new__(cls, counter): if counter > 0: rec5(counter-1) return object.__new__(cls) class rec6(object): def __init__(self, counter): if counter > 0: rec6(counter-1) if __name__ == '__main__': import sys for cls in [rec1, rec2, rec3, rec4, rec5, rec6]: for i in [250, 334, 500, 1000, 2000]: try: cls(i) except RuntimeError: print "%s stopped at %d" % (cls.__name__, i) break