Class, object question.

harold fellermann harold.fellermann at upf.edu
Wed Apr 6 06:38:09 EDT 2005


> What I am wondering is if I have a 2nd init  or something similar to 
> create a vector. Such as what follows and if I can how do I go about 
> implementing it?
>
> Class vector(point):
>     def __init___(self, point1, point2):
>         self.i = point2.get_x() - point1.get_x()
>         self.j = point2.get_y() - point1.get_y()
>         self.k =  point2.get_z() - point1.get_z()
>
>     def __init___(self, i, j, k):
>         self.i = i
>         self.j = j
>         self.k = k
>
> That way I can define a vector either using 2 points or if I have the 
> vector data itself?


Well, what you want to do -- polymorphism of function signatures -- can 
be
implemented like this:

class vector_1(point) :
	def __init__(self,*args) :
		if len(args) == 2 and isinstance(args[0],point) and 
isinstance(args[1],point) :
			self.i = args[0].get_x() - args[1].get_x()
			self.j = args[0].get_y() - args[1].get_y()
			self.k = args[0].get_z() - args[1].get_z()

		elif len(args) == 3 :
			self.i,self.j,self.k = args

		else :
			raise ValueError, "wrong arguments for instance initialization"


You can also find a nice implementation by Guido van Rossum using 
decorators
at Artima (look for multimethods).
However, I would prefer to avoid this sort of polymorphism because it 
only
obfuscates your code. IMHO, there should be exactly one clear way to 
initialize
an instance. Therefore, I suggest the provide a class method that 
serves as a
special instance factory:

class vector_2(point) :
	def __init__(self,i,j,k) :
		self.i = i
		self.j = j
		self.k = k

	@classmethod
	def difference(cls,point1,point2) :
		return cls(
			point1.get_x() - point2.get_x(),
			point1.get_y() - point2.get_y(),
			point1.get_z() - point2.get_z()
		)

# how to use it:
point1 = Point(4,5,6)
point2 = Point(1,2,3)
vec = vector_2.difference(point1,point2)


I wonder, why your vector inherits from point though.
And of course, class is written lower case.

Cheers,

- harold -

--
Es ist schon längst alles gesagt worden --
aber noch nicht von jedem.
-- Karl Valentin




More information about the Python-list mailing list