Conflicting needs for __init__ method

Ziga Seilnacht ziga.seilnacht at gmail.com
Mon Jan 15 01:49:00 CET 2007


Mark wrote:

[a lot of valid, but long concerns about types that return
 an object of their own type from some of their methods]

I think that the best solution is to use an alternative constructor
in your arithmetic methods. That way users don't have to learn about
two different factories for the same type of objects. It also helps
with subclassing, because users have to override only a single method
if they want the results of arithmetic operations to be of their own
type.

For example, if your current implementation looks something like
this:

    class Rational(object):

        # a long __init__ or __new__ method

        def __add__(self, other):
            # compute new numerator and denominator
            return Rational(numerator, denominator)

        # other simmilar arithmetic methods


then you could use something like this instead:

    class Rational(object):

        # a long __init__ or __new__ method

        def __add__(self, other):
            # compute new numerator and denominator
            return self.result(numerator, denominator)

        # other simmilar arithmetic methods

        @staticmethod
        def result(numerator, denominator):
            """
            we don't use a classmethod, because users should
            explicitly override this method if they want to
            change the return type of arithmetic operations.
            """
            result = object.__new__(Rational)
            result.numerator = numerator
            result.denominator = denominator
            return result


Hope this helps,
Ziga




More information about the Python-list mailing list