在我参与过的一些大型项目中,在处理某些对象时,我总是遇到同样的问题。假设我有一些矢量类Vector
,它具有x
和y
属性。拥有这个矢量类很好,很高兴自己拥有所有数据,但同时允许矢量由2元组表示也很方便。
所以我的困境是这样的;我应该只提供Vector
的类实现,其中任何和所有函数都应用于作为Vector
类的方法的向量,或者我是否应该提供与方法具有相同功能的函数但是对2元组采取行动,即不受任何级别的约束?或者我应该提供面向对象的和功能实现吗?
如果它有所不同,我就用Python来问这个问题。
答案 0 :(得分:1)
我认为这将归结为偏好,但我会做这样的事情
import operator,functools
import numpy
class Vector: #encompass the behavior in its own class
@classmethod
def dot_product(cls,p1,p2):
#treat p1 and p2 as tuples
return numpy.dot(p1,p2)
@classmethod
def cross_product(cls,p1,p2):
#treat p1,p2 as tuples
return numpy.cross(p1,p2)
class Vector2d: #encapsulate the data in its own class
def __init__(self,points):
#validate construction data
self.points = points
def __getitem__(self,item): #now this will act like an array
return self.points[item] #allows indexing
def __getattr__(self,attr): #allows it to act like a vector (above)
return functools.partial(getattr(Vector,attr),self.points)
class Vector3d(Vector2d):
pass
a = Vector2d([2,3])
b = [4,5]
c = Vector3d([2,3,4])
d = [3,4,5]
print a.dot_product(b)
print c.cross_product(d)
但这只是因为我喜欢python魔术:P