Определенные функции внутри класса не распознаются как определенные, когда я их использую - PullRequest
0 голосов
/ 15 марта 2020

У меня есть этот код, но когда я пытаюсь использовать переопределенную функцию str, она ничего не печатает, и, что более важно, определенная функция с именем "cuadrant" не работает, так как она не определена в соответствии с python, но это:

class Point:
    def __init__(self, x = 0, y = 0):
        self.x = x
        self.y = y
        print('The point ({},{}) has been created'.format(self.x, self.y))

    def __del__(self):
        print('The point ({},{}) has been deleted or overwritten'.format(self.x, self.y))

    def __str__(self):
        return '({},{})'.format(self.x, self.y)

    def cuadrant(self):
        if self.x > 0 and self.y > 0:
            return '1st Cuadrant'
        elif self.x < 0 and self.y > 0:
            return '2nd Cuadrant'
        elif self.x < 0 and self.y < 0:
            return '3rd Cuadrant'
        elif self.x >0 and self.y < 0:
            return '4th Cuadrant'
        else:
            return 'Original Point'

A = Point(4, 5)
B = Point(8, 9)

str(A)
str(B)

cuadrant(A)
cuadrant(B)

Я получаю следующее сообщение об ошибке:

runfile('C:/Users/Jorge87/Desktop/Master Tema 1.5/prueba.py', wdir='C:/Users/Jorge87/Desktop/Master 
Tema 1.5')
The point (4,5) has been created
The point (8,9) has been created
Traceback (most recent call last):

File "<ipython-input-9-16e5df591861>", line 1, in <module>
runfile('C:/Users/Jorge87/Desktop/Master Tema 1.5/prueba.py', wdir='C:/Users/Jorge87/Desktop/Master 
Tema 1.5')

File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 
827, in runfile
execfile(filename, namespace)

File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 
110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Users/Jorge87/Desktop/Master Tema 1.5/prueba.py", line 38, in <module>
cuadrant(A)

NameError: name 'cuadrant' is not defined

Ответы [ 2 ]

2 голосов
/ 15 марта 2020

Похоже, вы неправильно понимаете концепцию метода . в python метод вызывается из объекта с использованием точки, а именно: A.cuadrant () - Хорошо, cuadrant (A) - Неправильно.

Правка # 1: я должен упомянуть, что в некоторых В языках, например, C ++, можно вызывать метод, используя пространство имен класса и передавая указатель на объект в качестве первого параметра

Правка # 2: Вдохновленный из комментариев и правка # 1, Точка .cuadrant (A) может работать, попробуйте тоже. попробуйте разные методы выполнения методов, чтобы полностью понять, как они работают.

1 голос
/ 15 марта 2020

Вопрос 1. Переопределенная функция str ничего не печатает

Вы используете str в своем коде:

str(A)
str(B)

str возвращает ожидаемую строку, но Вы ничего не делаете с этим.
Так что ничего не напечатано. Вы должны сделать:

print(str(A))
print(str(B))

Вопрос 2. «cuadrant» не работает

Методы могут ссылаться на пространство имен класса.
Так что если вы хотите сослаться cuadrant метод, вы должны код Point.cuadrant.

print(Point.cuadrant(A))

может работать.
Или, более обычно:

print(A.cuadrant())
...