Wayne Werner wrote:
> class Point2D(PointND):
>     def __init__(self, x = 0, y = 0):
>         super(Point2D, self).__init__([x,y])
>         self.x = 0
>         self.y = 0
> 
> though you wouldn't be able to directly modify the values, or you'll 
> lose the distance function. You'd have to create setter functions, and as 
> such should rename x and y to _x and _y, to indicate that sure you *can* 
> touch 
> these, but really you shouldn't.
> 
> For the 3d, you'd just add a z param, although to really generalize your 
> ND class you could do this instead:
> 
> class PointND(object):
>    def __init__(self, x=0, y=0, z=0, a_list=None):
>        if a_list is not None:
>            self.a_list = a_list[:]
>        self.x = x
>        self.y = y
>        self.z = z
>   
>    def coords(self):
>        return [self.x, self.y, self.z] + self.a_list
>    ...
> 
> Then your subclass takes less effort:
> 
> class Point2D(PointND):
>     def __init__(self, x=0, y=0):
>         super(Point2D, self).__init__(x,y)
> 
> and this allows you to access point.x, point.y, and point.z directly.
> 
> Of course you could also subclass list with ND and just use descriptors 
> for self[0], self[1], and self[2]:
> http://users.rcn.com/python/download/Descriptor.htm

Thanks all for good suggestions.  I'm intrigued by the idea of subclassing list 
(suggested by both Bob and Wayne) and using x, y and z as descriptors to the 
elements in the list.  Obviously, it's important that the descriptors (x,y,z) 
stay in sync with the list itself so that:

  >>> p = PointND(1,2,3)
  >>> p.x = 10
  >>> p
  [10,2,3]

>From what I understood of the link Wayne sent, I should be able to use __set__ 
>to create this relationship between the labels and the list, but I'm totally 
>lost on how to do this.  It seems like x,y,z need to be instances of 
>descriptor objects who have values that are associated with the list.

In the mean time, I've overridden __setattr__ to enforce this, but it looks a 
bit crufty.  Any further suggestions are most welcome.

class PointND(list):
    def __init__(self, *a_list):
        super(PointND, self).__init__(a_list)
        if len(self) <= 3:
            self.x = self[0]
        if len(self) >= 2 and len(self) <= 3:
            self.y = self[1]
        if len(self) == 3:
            self.z = self[2]

    def __setattr__(self, attr, value):
        if attr in ('x', 'y', 'z'):
            self.__dict__[attr] = value
            if attr == 'x':
                self[0] = value
            elif attr == 'y':
                self[1] = value
            else:
                self[2] = value 
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to