在Python中创建一个Point类

5
我正在尝试在Python中创建一个名为“Point”的类。我想在坐标平面上创建一个点,跟踪它们,并找到它们之间的距离。我必须使用函数和方法。这是我的代码,但我不确定在执行程序时如何使用它。任何帮助将不胜感激。

编辑:更新代码

import math


class Point(object):
    '''Creates a point on a coordinate plane with values x and y.'''

    COUNT = 0

    def __init__(self, x, y):
        '''Defines x and y variables'''
        self.X = x
        self.Y = y

    def move(self, dx, dy):
        '''Determines where x and y move'''
        self.X = self.X + dx
        self.Y = self.Y + dy

    def __str__(self):
        return "Point(%s,%s)"%(self.X, self.Y) 


    def getX(self):
        return self.X

    def getY(self):
        return self.Y

    def distance(self, other):
        dx = self.X - other.X
        dy = self.Y - other.Y
        return math.sqrt(dx**2 + dy**2)

    def testPoint(x=0,y=0):
        '''Returns a point and distance'''
        p1 = Point(3, 4)
        print p1
        p2 = Point(3,0)
        print p2
        return math.hypot(dx, dy)

    print "distance = %s"%(testPoint()) 

我仍然需要帮助理解如何实际使用代码。这就是我创建testPoint函数的原因。当我实际在IDLE中执行代码时,如何证明一切正常?谢谢大家!
我还需要添加代码到构造函数中,每次创建Point对象时将COUNT增加1。我还需要添加适当的代码,以便可以使用比较运算符比较点,而'points'则基于它们距离原点的距离进行比较。

4
除非出于某种原因需要将属性转换为属性,否则不要在Python中编写getter。 - wim
我会创建x和y函数,并像shapely一样将它们用作属性。 - g07kore
4个回答

7
不要忘记 math.hypot
def distance(self, p):
    dx = self.X - p.X
    dy = self.Y - p.Y
    return hypot(dx, dy)

4
  • 你声明distance需要一个参数p,但是在方法内部你却用other代替它。在声明中把p改成other以匹配方法内部的引用。

  • sqrt()不是内置函数,你需要使用import math导入math模块并将其作为math.sqrt()来调用。

  • 你没有对声明的testPoint()函数做任何操作;你可以在结尾添加代码来调用它:

print "distance = %s"%(testPoint())

此时,你的代码可运行,并计算出两点之间的距离为4.0。

现在,一些风格上的问题:

  • 在Python中,你不需要将成员变量私有化,也不必编写微不足道的getter和setter方法,因此可以删除getX()getY()方法,并在给定Point p的情况下直接引用p.Xp.Y

  • math模块具有便利的斜边函数,在distance()中,你可以将返回行代码更改为return math.hypot(dx,dy)

  • 默认情况下,用户定义的对象具有一个不太吸引人的字符串表示:

    <__main__.Point object at 0x1004e4550>

你应该在类中定义一个字符串转换方法,像这样:

    def __str__(self):
        return "Point(%s,%s)"%(self.X,self.Y)

当对象需要被打印或转换为字符串时使用此方法。


谢谢您!非常有帮助和详尽。我已经应用了这些更改。我还需要在构造函数中添加代码,以便每次创建一个Point对象时将COUNT增加1。我还需要添加适当的代码,以便可以使用比较运算符进行点的比较,而点的比较是基于它们到原点的距离进行的。最后,我仍然需要帮助理解如何执行所有这些代码。这就是testPoint函数的作用。 - xrocker15
看起来你已经掌握了它。p1.move(2, 7)p1 从当前位置移动到 (5, 11)。p2.Y 是 0。按照这里描述的比较运算符定义:http://docs.python.org/reference/datamodel.html#object.__lt__,通过距离原点比较点来定义(虽然你可能只需要定义 __cmp__())。 - Russell Borogove
我应该在哪里实现p1.move和其他东西?p1是一个变量吗?这就是我困惑的部分。 - xrocker15

2

嗯,为什么不使用复数类而不是点类呢?它具有您正在寻找的所有属性以及更多(例如旋转)。

这里是一个使用繁琐表示法将复杂性“面向对象编程”的示例:

https://gist.github.com/jul/9286835


1
在你的Point.distance方法中,你引用了other.X和other.Y; 但"Other"并不存在。
你应该将distance签名更改为distance(self,other)或更改代码以使用p。
你还需要导入math.sqrt:
from math import sqrt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接