0

我定义了一个名为 Point 的类,它定义了 x、y 坐标系中的一个点。定义和方法如下所示。我创建了自己的str方法版本,以可打印的形式返回创建的点(必需)。但是,当我尝试使用调用 p.DistanceTo(p2) 将返回的点传递给另一个方法来确定两点(p1 和 p2)之间的距离时,我从尝试解析字符串(p2 ) 传递到方法中:

AttributeError: Point instance has no attribute 'find'

当我传入一个定义为 p2 的字符串时,它应该可以正常工作。任何帮助将不胜感激。谢谢你。

这是代码:

class Point:
    """ Define a Point
    """
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __str__(self):
        return "(" + str(self.x) + "," + str(self.y) + ")"

    def __getitem__(self,i):
        return i

    def __find__(self,j):
        return j

    def DistanceTo(self,p2):
        idx1 = p2.find("(")
        idx2 = p2.find(",")
        idx3 = p2.find(")")

        x2 = int(p2[idx1+1:idx2])
        y2 = int(p2[idx2+1:idx3])

        dist = math.sqrt(math.pow((x2-self.x),2)+math.pow((y2-self.y),2))
        return  dist


p1=Point()

p2=Point(3,4)

print p1.DistanceTo(p2)
4

3 回答 3

3

您命名了方法__find__。去掉双下划线:

def find(self, j):
    return j

您真的应该只对特殊方法名称__...__使用“dunder”(双下划线)方法名称,以避免混淆和未来的名称冲突。

但是,您正在传递一个Point实例,因此只需直接访问属性:

def DistanceTo(self,p2):
    x2 = p2.x
    y2 = p2.y

    dist = math.sqrt(math.pow((x2-self.x),2)+math.pow((y2-self.y),2))
    return  dist

或者,进一步简化,使用 Python 中最常用于方法的 underscore_name 样式:

def distance_to(self, p2):
    return math.sqrt(math.pow((p2.x - self.x), 2) + math.pow((p2.y - self.y), 2))

然后,您可以删除__find__和方法,这些看起来像是使该方法起作用__getitem__的尝试。.DistanceTo()

整个班级就变成了:

class Point(object):
    """Define a Point"""

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

    def __str__(self):
        return "({0.x}, {0.y})".format(self)

    def distance_to(self, p2):
        return math.sqrt(math.pow((p2.x - self.x), 2) + math.pow((p2.y - self.y), 2))

object对类(继承自)和__str__方法(使用字符串格式)使用更多的 Python 习惯用法。

现在该类的行为符合预期:

>>> p1 = Point()
>>> p2 = Point(3,4)
>>> print p1
(0, 0)
>>> print p2
(3, 4)
>>> print p1.distance_to(p2)
5.0

类实例不是字符串,尽管它们可以转换为字符串(例如打印时),但您不需要将它们视为字符串。只需直接访问它们的属性。

于 2013-05-08T15:12:38.850 回答
1

find 方法未在您的对象中声明,您必须像这样更改 find 方法声明:

...
def find(self,j):
    return j
...

双下划线保留用于类运算符方法,如 str、cmp、eq 等...您可以在此处获取有关 python 类的更多信息

于 2013-05-08T15:12:55.493 回答
0

如果您打算在您的类中使用私有或半私有方法,请重命名您的函数。

如果您的find方法仅在Point类内部使用,请将其重命名为__find. 否则,您可以将其重命名为_find告诉其他开发人员此方法是私有的,但他们仍然可以使用它,即使他们不应该使用它。

于 2013-05-08T16:20:29.007 回答