[PEAK] trellis attrs
P.J. Eby
pje at telecommunity.com
Fri Sep 30 17:14:39 EDT 2011
At 10:16 PM 9/30/2011 +0200, nicky van foreest wrote:
>Sorry to bug you, but I tried also the following:
>
>class Step(trellis.Component):
> duration = trellis.attr(0)
>
> def __init__(self, machine):
> self.machine = machine
> self.prevs = trellis.Set([])
>
>instead of
>
>class Step(trellis.Component):
> prevs = trellis.make(trellis.Set)
> duration = trellis.attr(0)
>
> def __init__(self, machine):
> self.machine = machine
>
>This also works (that is, I get the same schedule in both cases). Is
>there a difference between the two implementations?
The reason that your code currently *appears* to work is because
you're not changing the value of 'prevs' at runtime.
If at some point you did, say, "someStep.prevs =
trellis.Set(somedata)", your program would break because none of the
listeners of someStep.prevs would notice the change. That's why you
should always declare your attributes using trellis.* descriptors.
The more "correct" (trellisthonic?) way to write your code above is:
class Step(trellis.Component):
duration = trellis.attr(0)
prevs = trellis.make(trellis.Set)
machine = None
# No __init__ method necessary!
That is, there's no reason to have an __init__ method at all, since
trellis.Component() already takes keyword arguments and assigns them
to attributes, as long as they are defined in the class.
> The second implementation sets prevs as a class variable, but this does not
>appear necessary (telling from implementation 1).
Please note that 'prevs' is *not* a "class variable". It's a
descriptor. That is, Step.prevs is a descriptor object, but
someStep.prevs (where someStep is an instance of Step) will be a
distinct trellis.Set() instance, unless overridden when created (e.g.
via "someStep=Step(prevs=...)").
More information about the PEAK
mailing list