Ошибка при получении объекта «NoneType» при использовании классов в Python - PullRequest
1 голос
/ 29 апреля 2020

Я все еще новичок в этом сайте, так что простите за плохое форматирование. Я пытаюсь создать класс для точки на декартовой плоскости и метод для нахождения наклона линии, когда даются две точки. Однако, работая над этим, Pycharm говорит мне, что Instance attribute slope(name of variable) defined outside __init__. Однако, когда я помещаю self.slope в __init__ и назначаю его для запуска, выдается следующая ошибка:

Traceback (most recent call last):
  File "/Volumes/SEAGATE_for_editing/Programming/Python/graphing stuff/stuff.py", line 28, in <module>
    print(point1.slope(point2))
TypeError: 'NoneType' object is not callable

Как это исправить? Вот мой код Любая помощь с благодарностью.

class Point:

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

        self.y_slope = None
        self.x_slope = None
        self.slope = None

    def slope(self, other):
        self.y_slope = other.y - self.y
        self.x_slope = other.x - self.x
        self.slope = self.y_slope / self.x_slope
        return self.slope

    def dist(self, other):
        self.x_dist = other.x - self.x
        self.y_dist = other.y - self.y
        self.distance = ((self.x_dist ** 2) + (self.y_dist ** 2)) ** (1/2)
        return self.distance


point1 = Point(-2, -5)
point2 = Point(1, 1)
print(point1.slope(point2))
print(round(point1.dist(point2), 4))

Ответы [ 3 ]

4 голосов
/ 29 апреля 2020

point1.slope - это None. Вы сами устанавливаете None в __init__:

class Point:
    def __init__(self, x, y):
        self.x = x
        ...
        self.slope = None  # here

Вам не нужно self.slope здесь. Вы можете вернуть результат деления напрямую:

def slope(self, other):
    y_slope = other.y - self.y
    x_slope = other.x - self.x
    return y_slope / x_slope

Также нет необходимости в self.x_slope и self.y_slope, так как вы можете использовать обычные локальные переменные.


Это происходит потому, что Python динамически набирается. Вы также можете сделать print = lambda *args, **kwargs: "hacked!", и теперь вы ничего не можете print (__builtins__.print на помощь!).

3 голосов
/ 29 апреля 2020

Вы используете одно и то же имя для атрибута self.slope и вашего метода def slope(self, other). Атрибут затеняет имя метода, поэтому, когда вы пытаетесь вызвать point1.slope(...), он пытается вызвать значение атрибута, которое инициализируется как None.

Выберите разные имена для двух вещей, и ваш код будет работать как положено.

Или, как заметил ForceBru в своем ответе, просто не беспокойтесь ни о каких атрибутах, связанных с slope или dist, кажется, что они не нужны. Вместо этого вы можете использовать локальные переменные в своих методах, просто назовите их без префикса slope..

1 голос
/ 29 апреля 2020

У вас проблема с вашим методом наклона. У вас есть имя метода slope, и вы также устанавливаете self.slope с выводом, который вызывает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...