【问题标题】:Making a Point Class in Python在 Python 中创建点类
【发布时间】:2012-09-10 05:43:18
【问题描述】:

我正在尝试在 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 函数的原因。当我真正去执行IDLE中的代码时,我如何证明一切正常?谢谢大家!!

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

【问题讨论】:

  • 不要在 python 中编写 getter,除非/直到您出于某种原因必须将属性变为属性。
  • 我会创建 x 和 y 函数并将它们用作属性,就像 shapely 所做的那样。

标签: python class function methods point


【解决方案1】:

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

这是一个用迂腐符号“OOP”复合体的示例:

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

【讨论】:

    【解决方案2】:
    • 您声明distance 接受参数p;在您将其称为other 的方法中。将声明中的 p 更改为 other,以便它们匹配。

    • sqrt() 不是内置的;你需要做import math并将其称为math.sqrt()

    • 你没有对你声明的testPoint() 函数做任何事情;您可以通过在末尾添加一行来调用它:

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

    此时,您的代码可以工作并计算您的点之间的距离为 4.0。

    现在,一些风格问题:

    • 在 Python 中,您通常不会私有化成员变量,也不会费心编写琐碎的 getter 和 setter,因此您可以删除 getX()getY() 方法,只需参考 p.X 和 @987654335 @直接给了Point p

    • 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 函数的用途。
    • 看来你已经掌握了它。 p1.move( 2, 7 )p1 从其当前位置移动到 (5, 11)。 p2.Y 为 0。定义此处描述的比较运算符:docs.python.org/reference/datamodel.html#object.__lt__ 按与原点的距离比较点(尽管您可能只需定义 __cmp__() 就可以逃脱)。
    • 我将在哪里实现 p1.move 之类的。 p1 是变量吗?这就是我感到困惑的部分
    【解决方案3】:

    别忘了math.hypot

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

    【讨论】:

      【解决方案4】:

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

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

      您还需要导入 math.sqrt:

      from math import sqrt
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-30
        • 2015-10-11
        • 2010-11-11
        • 2023-02-14
        • 2020-01-15
        • 1970-01-01
        • 1970-01-01
        • 2021-02-21
        相关资源
        最近更新 更多