一个方法中的两个对象来自一个类?

时间:2013-11-21 11:33:31

标签: python class object

我对这段代码有一个小问题,我目前正在学习类并尝试将我创建的两个对象分开,以便在类的方法中使用它们。

import math

class Segment:

    def __init__(self, xcoord = 0, ycoord = 0):
        self.x = xcoord
        self.y = ycoord

    def get(self):
        return (self.x, self.y)

    def setx(self, xcoord):
        self.x = xcoord

    def sety(self, ycoord):
        self.y = ycoord

    def length(self, xcoord, ycoord):
        return math.sqrt(math.pow(xcoord-ycoord,2)+(xcoord-ycoord,2))

p1 = Segment(3,4)
p2 = Segment()
p2.setx(5)
p2.sety(5)
s = Segment(p1,p2)
print(Segment.get(p1))
print(Segment.get(p2))
print(s.length())

我知道我在length()方法中缺少参数,或者我没有?我想了解在定义对象后如何让对象与另一个对象进行交互。

为了进一步说明,我试图使用我分配给他们的参数打印两个对象之间的距离。

3 个答案:

答案 0 :(得分:3)

好的,让我们忘记一秒钟的代码。首先,我们来谈谈命名事物。您的Segment课程不属于分段 - 它是一类分数。因此,让我们首先重命名您的课程Point

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

更好,不是吗?

现在,想象一下你在看别人的代码,试着用它。他们的Point有一个length()方法可以调用。你有什么期望呢?那可能是什么?很多事情都是因为lengthPoint正在做的事情的可怕描述。它当然不是Point属性 - 一个点是0维的。

让我们重新考虑一下这个功能。制作此API有两种显而易见的方法 - 您的Point类可以使用distance_to(other_point)方法接受一个参数 - 另一个Point。 (可选)您可以使用模块级函数segment_length(point1, point2),它可以为您提供由两个Point对象定义的段的长度。

所以,模块级函数:

def segment_length(p1, p2):
   return math.sqrt((p2.x-p1.x)**2 + (p2.y-p1.y)**2)

如果您想尝试,我会将Point方法留给您。它看起来非常相似,仅使用self代替其中一个点。

答案 1 :(得分:1)

让我们来看看:

  • p1Segment类的一个实例,其属性为x=3, y=4
  • p2Segment类的一个实例,其属性为x=0, y=0
  • 当您将p2设置为(5, 5)时,您可以使用p2 = Segment(5, 5)
  • s将包含x=p1属性(Segment的实例,而不是坐标)和y=p2Segment的另一个实例)。

计算长度。

您的length方法应如下所示:

def length(self, xcoord, ycoord):
    return math.sqrt(math.pow(xcoord - self.x,2)+math.pow(ycoord - self.y,2))

现在使用类实例的xy坐标(在下面的示例中为p1)并计算它们之间的长度,以及xcoord和提供了ycoord个参数。

你可以这样称呼:

p2x, p2y = p2.get()
print(p1.length(p2x, p2y))

答案 2 :(得分:0)

首先,您错过了第二行math.pow()

return math.sqrt(math.pow(xcoord-ycoord,2)+(xcoord-ycoord,2))

其次,在您致电s = Segment(p1, p2)时,x y的{​​{1}}和Segment值等于s和{{{ 1}}。

目前你的价值应该是:

p1

在分配s之后,你得到:

p2

这是有问题的,因为p1.get() > (3, 4) p2.get() > (5, 5) 不知道如何处理s.get() > ((3, 4), (5, 5)) 对象。