当一个类在Python中使用另一个类时,反之亦然

时间:2017-11-03 07:52:51

标签: python class

假设我有一个名为Point的类:

class Point:
    def __init__(self, x, y):
        self.__x = x
        self.__y = y
    ...

我还有一个名为Line的班级,里面使用Point

class Line:
    #tail and head are supposed to be Point objects
    def __init__(self, tail, head):
        self.__tail = tail
        self.__head = head

问题是,我希望Point使用reflect方法,这只反映Line line的点:

#Point class
def reflect(self, line):
    #Reflection code that uses Line methods

所以我在这里有交叉引用。问题是解决这个问题的最佳方法是什么?或者我应该避免这种做法?

1 个答案:

答案 0 :(得分:2)

不,没有交叉引用,没有循环,没有无限循环,也没有无限递归,一切都很清楚。你可以这样做:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def reflect(self, line):  # line is a Line object
        reflected_x = None # replace w code to calc the reflection of x  vs. line
        reflected_y = None # replace w code to calc the reflection of y  vs. line
        return Point(reflected_x, reflected_y)

class Line:   # a Line defined by two Points 
    def __init__(self, tail, head):
        self.tail = tail
        self.head = head

我删除了变量中的双下划线,没有理由首先使用它。

可替换地:

  

(遵循彼得伍德在评论中的建议):反思应该   可能是非会员的功能。它似乎不是一个自然属性   或点的行为。你不希望它成为倾销场   你所有的转变。 (提示 - 可能会创建一个Transformer对象)

或者一个简单的函数,以Line和Point作为参数:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y


class Line:   # a Line defined by two Points 
    def __init__(self, tail, head):
        self.tail = tail
        self.head = head


def reflect(line, point):  # line is a Line object
    reflected_x = None # replace w code to calc the reflection of point.x  vs. line
    reflected_y = None # replace w code to calc the reflection of point.y  vs. line
    return Point(reflected_x, reflected_y)