我定义了一个名为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)
答案 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
,告诉其他开发人员这个方法是私有的,但他们仍然可以使用它,即使它们不应该使用它。