我对这段代码有一个小问题,我目前正在学习类并尝试将我创建的两个对象分开,以便在类的方法中使用它们。
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()
方法中缺少参数,或者我没有?我想了解在定义对象后如何让对象与另一个对象进行交互。
为了进一步说明,我试图使用我分配给他们的参数打印两个对象之间的距离。
答案 0 :(得分:3)
好的,让我们忘记一秒钟的代码。首先,我们来谈谈命名事物。您的Segment
课程不属于分段 - 它是一类分数。因此,让我们首先重命名您的课程Point
。
class Point:
def __init__(self, xcoord = 0, ycoord = 0):
self.x = xcoord
self.y = ycoord
更好,不是吗?
现在,想象一下你在看别人的代码,试着用它。他们的Point
有一个length()
方法可以调用。你有什么期望呢?那可能是什么?很多事情都是因为length
是Point
正在做的事情的可怕描述。它当然不是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)
让我们来看看:
p1
是Segment
类的一个实例,其属性为x=3, y=4
。p2
是Segment
类的一个实例,其属性为x=0, y=0
,p2
设置为(5, 5)
时,您可以使用p2 = Segment(5, 5)
,s
将包含x=p1
属性(Segment
的实例,而不是坐标)和y=p2
(Segment
的另一个实例)。您的length
方法应如下所示:
def length(self, xcoord, ycoord):
return math.sqrt(math.pow(xcoord - self.x,2)+math.pow(ycoord - self.y,2))
现在使用类实例的x
和y
坐标(在下面的示例中为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))
对象。