Recursive class | can you modify self directly?

Russel Walker russ.pobox at gmail.com
Tue Jul 9 18:01:40 EDT 2013


Sorry for the vague title. Probably best to just show you the code that explains it better.

This is a simplified example of what I want to do:


# THIS DOESN'T WORK
from random import choice

class Expr(object):
    """
    Expr(expr, op, val) -> an expression object.
    """

    def __init__(self, expr, op='', val=''):
        self.expr = expr # can be another instance of Expression.
        self.op = op
        self.val = val

    def __str__(self):
        return ("%s %s %s" % (self.expr, self.op, self.val)).strip()

    def expand(self):
        self = Expr(self, choice('+-*/'), choice('12345'))


Then I tried messing around with Expr.__new__() and Expr.__init__() but that didn't work.

The only way I've got it to work is by doing the expanding part outside of the object, by a method of some other class. But I want the Expr class to be responsible for itself. How can I do this and why doesn't the above work?



More information about the Python-list mailing list