[Pythonmac-SIG] self-instantiating instances in pyhton
Bob Ippolito
bob at redivi.com
Thu Jan 13 01:14:20 CET 2005
On Jan 12, 2005, at 12:52, Rayme Jernigan wrote:
> Hi,
>
> I'm looking for a language to abuse for a project I'm working on. I
> know a little Python, but I do not know if it can do this: I'd like to
> define some class "N" that instantiates objects that can instantiate
> fresh new objects of that same class... without external controller
> code.
>
> You could use this capability, for example, to generate a red-black
> tree-type data structure that implicitly instantiates a new node for
> each new input d1, d2, d3... so on. The algorithm for each node could
> be:
>
> -- Toggle downstream L/R pointer
> -- If no node there, instantiate one and link to it
> -- if a node is there, pass the datum to it
>
> The execution sequence as the tree builds itself out might look
> something like this:
>
> 1. n0 = N(d0) # new instance of N
> # (downstream pointer default = "Left")
> # (the first input data, d0, is instantiated in node n0)
> # nodes: n0
>
> 2. n0.send(d1) # toggle n0's downstream pointer to "Right"
> # on n0 there is no downstream node right so instantiate a new
> linked node right n1 with d1
> # nodes: n0,n1
>
> 3. n0. send(d2) # toggle n0's downstream pointer "Left"
> # in n0 there is no downstream node left so instantiate n2 with d2
> # nodes: n0,n1,n2
>
> 4. n0. send(d3) # toggle n0's downstream pointer "Right"
> # there exists a downstream node right, n1, so send d3 there
> # toggle n1's downstream pointer "Right"
> # in n1 there is no downstream node right so instantiate n3 with d3
> # nodes: n0,n1,n2,n3
>
> 5. n0. send(d4) # toggle n0's downstream pointer "Left"
> # there exists a downstream node left, n2, so send d4 there
> # toggle n2's downstream pointer "Right"
> # in n2 there is no downstream node right so instantiate n4 with d4
> # nodes: n0,n1,n2,n3,n4
>
> 6. n0.send(d5) # toggle n0's downstream pointer "Right"
> # there exists a downstream node right, n1, so send d5 there
> # toggle n1's downstream pointer "Left"
> # in n1 there is no downstream node left so instantiate n5 with d5
> # nodes: n0,n1,n2,n3,n4,n5
>
> 7. n0.send(d6) # So on...
> # ...
>
>
> Any thoughts about how to do this in Python appreciated. Possible at
> all? Thanks in advance,
I would guess that you'd want an implementation that looks kinda like
this:
class RBNode(object):
def __init__(self, value):
self.index = 0
self.nodes = [None, None]
self.value = value
def send(self, value):
node = self.nodes[self.index]
if node is None:
# use type(self) so that if this is a subclass,
# then the subclass would be used rather than
# RBNode
self.nodes[self.index] = type(self)(value)
else:
node.send(value)
self.index = (self.index + 1) % len(self.nodes)
-bob
More information about the Pythonmac-SIG
mailing list