point class help
Steve Holden
steve at holdenweb.com
Wed Jan 14 11:44:35 EST 2009
r wrote:
> I am hacking up a point class but having problems with how to properly
> overload some methods. in the __add__, __sub__, __iadd__, __isub__, I
> want to have the option of passing an instance or a container(list,
> tuple) like
>
>>>> p1 = Point2d(10,10)
>>>> p1 += (10,10)
>>>> p1
> Point2d(20,20)
>>>> p2 = Point2d(10,10)
>>>> p2 += p1
>>>> p2
> Point2d(30,30)
>
>
> here is what i have, it would seem stupid to use a conditional in each
> method like this...
>
> def method(self, other):
> if isinstance(other, Point2d):
> x, y = origin.x, origin.y
> else:
> x, y = origin[0], origin[1]
> #modify self.x & self.y with x&y
>
> there must be a way to get the x, y with reusable code, i am not about
> to have this conditional under every method call, What am i missing
> here?
>
Not much. If you want these points to be freely mixable with containers
then you should define a function like makePoint:
def makePoint(x):
if type(x) is Point: # assumes new-style classes
return x
else:
return Point(x)
>
> class Point2d():
> def __init__(self, x, y=None):
> if type(x) == tuple:
> self.x = x[0]
> self.y = x[1]
> else:
> self.x = x
> self.y = y
>
> def __str__(self):
> return 'Point2d(%f, %f)' %(self.x, self.y)
>
> def __add__(self, other):
> if isinstance(other, Point2d):
> x, y = origin.x, origin.y
> else:
> x, y = origin[0], origin[1]
> return (self.x+x, self.y+y)
>
> def __sub__(self, other):
> pass
>
> def __iadd__(self, other): #+=
> pass
>
> def __isub__(self, other): #-=
> pass
>
> any ideas?
Then your __add__ method would become:
def __add__(self, other):
other = makePoint(other)
return (self.x+other.x, self.y+other.y)
Thous it does seem particularly perverse to have the add method not
itself return a Point.
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
More information about the Python-list
mailing list