Важна ли область действия метода при определении методов внутри класса? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть метод, который возвращает четыре переменные, которые используются для создания прямоугольника.Но функция использует другие методы для получения некоторых значений.

Так что мой метод rectangle_points () получает две точки от x_value () и y_value () соответственно, но по какой-то причине я не могу вызвать функцию для x_value ()изнутри rectangle_points () я получаю NameError: имя 'x_value' не определено

from random import *

class Rectangle:
    def x_value():
        return choice(range(0, 800, 10))

    def y_value():
        return choice(range(0, 600, 10))

    def rectangle_points():
        x1 = x_value()
        y1 = y_value()
        x2 = x1 + 10
        y2 = y1 + 10
        return x1, y1, x2, y2

    print('for rectangle points are {}'.format(rectangle_points()))

ожидаемые результаты на данный момент должны состоять в распечатке четырех точек, но я получаю NameError: name 'x_value' неопределены.PS Я предполагаю, что получу ту же проблему для строки y1 = y_value (), если она достигнет этой линии.

Ответы [ 3 ]

1 голос
/ 29 марта 2019

Это просто быстрое решение. При создании методов для класса, self всегда вызывается во время его инициализации. Это позволяет вам использовать другие методы из того же класса при создании нового метода. Это должно исправить ваш код!

from random import *

class Rectangle:
    def x_value(self):
        return choice(range(0, 800, 10))

    def y_value(self):
        return choice(range(0, 600, 10))

    def rectangle_points(self):
        x1 = self.x_value()
        y1 = self.y_value()
        x2 = x1 + 10
        y2 = y1 + 10
        return x1, y1, x2, y2
rec = Rectangle()
print('for rectangle points are {}'.format(rec.rectangle_points()))
1 голос
/ 29 марта 2019

Основываясь на предложении @JBirdVegas, я хотел бы предоставить вам полный ответ.

from random import choice

class Rectangle:
    def x_value(self):
        return choice(range(0, 800, 10))


    def y_value(self):
        return choice(range(0, 600, 10))


    def rectangle_points(self):
        x1 = self.x_value()
        y1 = self.y_value()
        x2 = x1 + 10
        y2 = y1 + 10
        return x1, y1, x2, y2


r = Rectangle()
print('for rectangle points are {}'.format(r.rectangle_points()))

Вы должны указать интерпретатору ссылку на собственную функцию класса.Вы можете добиться этого, добавив self

Таким образом, интерпретатор знает, что он ссылается на себя, то есть Rectangle.x_value, а не просто x_value.Как ранее предлагалось в комментариях, я советую вам изучить документацию для получения более подробной информации, но это должно исправить все ваши проблемы на данный момент.

РЕДАКТИРОВАТЬ: Я хотел бы добавить, что использование import * не всегдалучшее решение, вы можете изменить его на from random import choice, чтобы избежать раздувания и возможных ошибок, если библиотеки имеют одинаковые именованные объекты

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

Ты так близко !!!

Просто добавь self как self.x_value()

И если первый параметр должен быть self

def x_value(self):

self означает, что функция является членом экземпляра, а не членом класса.

И print, вероятно, не должны иметь отступ, но это не так важно

...