'float' object is not callable хотя я пробовал удалять скобки и/или менять тип с помощу int()

import turtle
from win32api import GetSystemMetrics
import objects

win_w = GetSystemMetrics(0)
win_h = GetSystemMetrics(1)

window = turtle.Screen()
x1 = -(win_w / 2) + (0.065 * win_w)
x2 = (win_w / 2) - (0.065 * win_w)
window.bgcolor("black")
window.setup(win_w, win_h)
window.tracer()

player_1 = objects.Game_element([x1, 0], 5, 1)

player_2 = objects.Game_element([x2, 0], 5, 1)

ball = objects.Game_element([0, 0], 1, 1)

window.listen()


def up_1():
    player_1.sety(player_1.ycor() + 10)


window.onkeypress(up_1, "w")

while True:
    window.update()

Файл Objects.py:

 import turtle


class Game_element():
    def __init__(self, goto,x,y):
        self = turtle.Turtle()
        self.color("white")
        self.shape("square")
        self.penup()

        self.shapesize(x,y)
        self.goto(goto)

    def ycor(self):
        self._ycor = turtle.ycor()
        return self._ycor

    def sety(self,y):
        self._sety = turtle.sety(y)
        return self._sety

Ответы (1 шт):

Автор решения: CrazyElf

Вы зря сделали одинаковое название и у метода и у поля класса. Упрощу ситуацию для понятности:

class Game_element():

    def ycor(self):
        self.ycor = 3.14 # <-- ПРОБЛЕМА ТУТ
        return self.ycor

player1 = Game_element()
y = player1.ycor() # первый вызов будет успешным
y = player1.ycor() # а второй вызов уже не получится

Выходит ошибка на втором вызове:

TypeError                                 Traceback (most recent call last)
<ipython-input-51-3595c07fa764> in <module>()
      7 player1 = Game_element()
      8 y = player1.ycor()
----> 9 y = player1.ycor()

TypeError: 'float' object is not callable

После выполнения строки self.ycor = turtle.ycor() переменная ycor экземпляра класса player1 больше не указывает на метод def ycor(), она указывает на значение, полученное через вызов turtle.ycor(), а там видимо число с плавающей точкой. Поэтому такая ошибка.

Назовите метод класса как-то по-другому, не также, как называется поле. Для того, чтобы не было такой путаницы, часто принимают такую конвенцию - называть поля класса с подчёркиванием перед именем. Тогда вы их точно не перепутаете с методами. Например, так:

def ycor(self):
    self._ycor = turtle.ycor()
    return self._ycor
→ Ссылка