在Python中创建Point类

在Python中创建Point类,python,class,function,methods,point,Python,Class,Function,Methods,Point,我试图用python创建一个名为“Point”的类,我试图在坐标平面x和y上创建一个点并跟踪它们。以及找出点之间的距离。我必须使用函数和方法。我已经开始了,这是我的代码。我只是不知道如何使用它,当我去执行程序。任何帮助都将不胜感激 编辑:更新代码 import math class Point(object): '''Creates a point on a coordinate plane with values x and y.''' COUNT = 0 de

我试图用python创建一个名为“Point”的类,我试图在坐标平面x和y上创建一个点并跟踪它们。以及找出点之间的距离。我必须使用函数和方法。我已经开始了,这是我的代码。我只是不知道如何使用它,当我去执行程序。任何帮助都将不胜感激

编辑:更新代码

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
函数的原因。当我真的在空闲状态下执行代码时,我如何证明一切正常?谢谢大家

我还需要向构造函数添加代码,以便在每次创建点对象时将
COUNT
增加1。我还需要添加适当的代码,以便可以使用比较运算符比较点,同时根据与原点的距离比较“点”

  • 您声明
    distance
    作为参数
    p
    ;在方法内部,您将其称为
    other
    。将声明中的
    p
    更改为
    other
    ,以便它们匹配

  • sqrt()
    不是内置的;您需要执行
    导入数学
    ,并将其称为
    math.sqrt()

  • 您没有使用您声明的
    testPoint()
    函数执行任何操作;您可以通过在末尾添加一行来调用它,如:

打印“距离=%s”%(testPoint())

在这一点上,您的代码工作并计算点之间的距离为4.0

现在,一些风格问题:

  • 在Python中,通常不会私有化成员变量,也不会编写琐碎的getter和setter,因此可以删除
    getX()
    getY()
    方法,只需直接引用
    p.X
    p.Y
    ,只要给出
    点p

  • math
    模块有一个方便的斜边函数,因此在
    distance()
    中,可以将返回行更改为
    return math.hypot(dx,dy)

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

您应该在类中定义字符串转换方法,如下所示:

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

打印对象或需要将对象转换为字符串时将使用此选项。

在Point.distance方法中,引用other.X和other.Y;其他的不存在

您应该将距离签名更改为距离(self,other),或者将代码更改为使用p

您还需要导入math.sqrt:

from math import sqrt

别忘了
math.hypot

def distance(self, p):
    dx = self.X - p.X
    dy = self.Y - p.Y
    return hypot(dx, dy)

嗯,为什么不使用复杂类而不是点类呢? 它具有您正在搜索的所有属性和更多属性(例如旋转)

下面是一个用迂腐的符号“OOP”复杂结构的示例:


除非出于任何原因必须将属性转换为属性,否则不要用python编写getter。我会创建x和y函数,并像shapely那样将它们用作属性。谢谢您,先生!非常有帮助和彻底。我已经应用了这些更改。我还需要向构造函数添加代码,以便在每次创建点对象时将计数增加1。我还需要添加适当的代码,以便在根据点与原点的距离进行比较时,可以使用比较运算符对点进行比较。最后,我仍然需要帮助理解如何执行所有这些代码。这就是testPoint函数的作用。看起来你已经掌握了它的控制权<代码>p1。移动(2,7)将
p1
从其当前位置移动到(5,11)<代码>p2.Y为0。定义此处描述的比较运算符:通过与原点的距离来比较点(尽管您可能只需要定义
\uuu cmp\uuu()
)就可以了。我将在何处实现p1.move之类的操作。p1是一个变量吗?这是我感到困惑的部分