top button
Flag Notify
    Connect to us
      Site Registration

Site Registration

Recursive class | can you modify self directly when using python

0 votes
402 views

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?

posted Jul 9, 2013 by anonymous

Share this question
Facebook Share Button Twitter Share Button LinkedIn Share Button

1 Answer

0 votes

"self" is just a local binding of the object to the name self. You can rebind the name like this as with any other local variable, but that's all it does. It doesn't modify the object in any way, and no other bindings of the same object are affected.

If you actually want to modify the current object, you would need to do something like:

 def expand(self):
 import copy
 self.expr = Expr(self.expr, self.op, self.val)
 self.op = choice('+-*/')
 self.val = choice('12345')
answer Jul 9, 2013 by anonymous
Minus the "import copy".
Similar Questions
0 votes

I am extending a parser and need to create many classes that are all subclassed from the same object (defined in an external library). When my module is loaded I need all the classes to be created with a particular name but the behavior is all the same. Currently I have a bunch of lines like this:

 class Vspace(Base.Command): pass
 class Boldpath(Base.Command): pass

There are a bunch of lines like that. Is there a better way? Something like

 newclasses = ['Vspace', 'Boldpath', ... ]
 for name in newclasses:
 tmp = type(name, (Base.Command,) {})
 tmp.__name__ = name

Is there a more pythonic way?

...