在是否提供基于面向对象的实现或基元的功能实现之间进行选择

时间:2014-06-19 23:06:50

标签: python oop functional-programming

在我参与过的一些大型项目中,在处理某些对象时,我总是遇到同样的问题。假设我有一些矢量类Vector,它具有xy属性。拥有这个矢量类很好,很高兴自己拥有所有数据,但同时允许矢量由2元组表示也很方便。

所以我的困境是这样的;我应该只提供Vector的类实现,其中任何和所有函数都应用于作为Vector类的方法的向量,或者我是否应该提供与方法具有相同功能的函数但是对2元组采取行动,即不受任何级别的约束?或者我应该提供面向对象的功能实现吗?

如果它有所不同,我就用Python来问这个问题。

1 个答案:

答案 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