AttributeError: у объекта 'str' нет атрибута 'dist' - PullRequest
0 голосов
/ 17 марта 2019

Я не очень понимаю, что означает эта ошибка.все до последней строки кода работает отлично.

import math 
# the 2D point class
class Point(object):

    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y
    #accessor for x
    @property
    def x(self):
        return self._x

    #mutator for x
    @x.setter
    def x(self, value):
        if (value != 0):
            self._x = float(value)
        else:
            self._x = float(0.0)
    #accessor for y
    @property
    def y(self):
        return self._y

    #mutator for y
    @y.setter
    def y(self, value):
        if (value != 0):
            self._y = float(value)
        else:
            self._y = float(0.0)
    def __str__(self):
        return "{},{}".format(self.x, self.y)

    #This finds the distance between 2 points
    def dist(x, y):
        x1 = x.x
        x2 = y.x
        y1 = x.y
        y2 = y.y

        calc = "{}".format(math.sqrt((x2-x1)**2 + (y2-y1)**2))
        return calc

    #This finds the midpoint of 2 points
    def midpt(x,y):
        x1 = x.x
        x2 = y.x
        y1 = x.y
        y2 = y.y

        calc = "({},{})".format(((x1+x2)/2),((y1+y2)/2))
        return calc

##########################################################
# ***DO NOT MODIFY OR REMOVE ANYTHING BELOW THIS POINT!***
# create some points
p1 = Point()
p2 = Point(3, 0)
p3 = Point(3, 4)
# display them
print "p1:", p1
print "p2:", p2
print "p3:", p3
# calculate and display some distances
print "distance from p1 to p2:", p1.dist(p2)
print "distance from p2 to p3:", p2.dist(p3)
print "distance from p1 to p3:", p1.dist(p3)
# calculate and display some midpoints
print "midpt of p1 and p2:", p1.midpt(p2)
print "midpt of p2 and p3:", p2.midpt(p3)
print "midpt of p1 and p3:", p1.midpt(p3)
# just a few more things...
p4 = p1.midpt(p3)
print "p4:", p4
print "distance from p4 to p1:", p4.dist(p1)

вывод для кода должен быть:

p1: 0.0,0.0
p2: 3.0,0.0
p3: 3.0,4.0
distance from p1 to p2: 3.0
distance from p2 to p3: 4.0
distance from p1 to p3: 5.0
midpt of p1 and p2: (1.5,0.0)
midpt of p2 and p3: (3.0,2.0)
midpt of p1 and p3: (1.5,2.0)
p4: (1.5,2.0)
distance from p4 to p1: 2.5

Но вывод, который я получаю:

p1: 0.0,0.0
p2: 3.0,0.0
p3: 3.0,4.0
distance from p1 to p2: 3.0
distance from p2 to p3: 4.0
distance from p1 to p3: 5.0
midpt of p1 and p2: (1.5,0.0)
midpt of p2 and p3: (3.0,2.0)
midpt of p1 and p3: (1.5,2.0)
p4: (1.5,2.0)
distance from p4 to p1:

Traceback (most recent call last):
  File "C:\Users\owens\Downloads\01 2D Points-TEMPLATE.py", line 81, in <module>
    print "distance from p4 to p1:", p4.dist(p1)
AttributeError: 'str' object has no attribute 'dist'

Как я уже сказал, я действительно не понимаю, что означает эта ошибка, и когда я ее ищу, это немного смущает меня, потому что код не такой простой, как мой.Я имею некоторое представление о том, что это значит, но если кто-то может помочь мне объяснить это, это было бы здорово.Я уверен, что это связано с последними тремя строками и тем, что p4 не в классе Point, но, как я уже сказал, я не уверен.Спасибо за ваше время.

1 Ответ

0 голосов
/ 17 марта 2019

Сообщение об ошибке, которое вы видите, означает, что вы ожидаете, что объект p4 будет иметь метод .dist, но объект p4 является строковым объектом. Я думаю, что вас смущает то, что p1, p2 и p3 являются объектами Point (поэтому у них есть метод .dist), но когда вы выполняете метод .midpt для создания переменной p4, метод возвращает строку. Возвращает "(1.5,2.0)" против точки (1.5,2.0). Поэтому, если вы хотите, чтобы ваш код работал, вы должны изменить переменную calc в методе .midpt на что-то вроде этого:

calc = Точка ((x1 + x2) / 2), ((y1 + y2) / 2))

...