Tim Golden napisa (a):

> It's only a moment before the metaclass and
> the Twisted solution come along. :)

I couldn't resist. It's not as elegant as I hoped, but hey, at least
it memoizes the intermediate classes :-)


class fact_0(object):
        value = 1

class fact_meta(object):
        def __new__(cls, name, bases, attrs):
                n = attrs['n']
                class_name = 'fact_%i' % n
                try:
                        return globals()[class_name]
                except KeyError:
                        new_class = type(class_name, bases, {})
                        new_class.value = n * fact(n - 1).value
                        new_class.__str__ = lambda self: str(self.value)
                        globals()[class_name] = new_class
                        return new_class

class fact(object):
        def __new__(self, n_):
                class spanish_inquisition(object):
                        __metaclass__ = fact_meta
                        n = n_
                return spanish_inquisition()

print fact(5)
print fact(3)
print fact(1)

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to