Python在类中查找方法

时间:2013-05-08 15:11:30

标签: python class definition

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

3 个答案:

答案 0 :(得分:3)

您将方法命名为__find__。删除双下划线:

def find(self, j):
    return j

你应该只为Special method names使用__...__“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中最常用于方法的下划线样式:

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))

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

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

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

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

答案 1 :(得分:1)

方法find未在您的对象中声明,您必须更改find​​方法声明,如下所示:

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

双下划线保留用于类操作符方法,如str,cmp,eq等... 您可以获得有关python类here

的更多信息

答案 2 :(得分:0)

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

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