Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

AttributeError: 'Player' object has no attribute 'radius'

I am getting this Error AttributeError: 'Player' object has no attribute 'radius'

The Player class:

import pyglet
from pyglet import shapes, text

from .Entity import Entity


@Entity.register
class Player(Entity):

    def __init__(self, name, x, y, handler, dN=False):
        super().__init__(name, x, y, handler, dN)
        self.speed = 2
        self.radius = 5
        self.direction = (0, 0)

    def getShape(self, batch: pyglet.graphics.Batch):
        # [...]
        return shapes.Circle(x=self.x, y=self.y, radius=self.radius, color=(255, 0, 0), batch=batch) # works

    def calcDirection(self):
        # does not access self.radius
        pass

    def tick(self):
        self.calcDirection()
        self.x += self.direction[0] * self.speed
        self.y += self.direction[1] * self.speed
        if self.x < self.radius: # no error
            self.x = self.radius
        if self.y < self.radius:
            self.y = self.radius
        if self.x > self.handler.getWidth() - self.radius:
            self.x = self.handler.getWidth() - self.radius
        if self.y > self.handler.getHeight() - self.radius:
            self.y = self.handler.getHeight() - self.radius
        self.hitbox.tick()

    def getWidth(self):
        return self.radius * 2 # Attribute Error

    def getHeight(self):
        return self.radius * 2

The Error occurs in the getWidth() method. I can access self.radius in every other method.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Here is the Entity Base class

import abc

import pyglet

from Game.Handler import Handler
from .HitBox import HitBox

# Entity Base
class Entity(abc.ABC):
    def __init__(self, name: str, x: int, y: int,handler:Handler, displayName:bool=False, hitboxMarginX:int=0, hitboxMarginY:int=0):
        self.name = name
        self.x = x
        self.y = y
        self.displayName = displayName
        self.handler = handler
        self.hitbox = HitBox(self, hitboxMarginX, hitboxMarginY)

    @abc.abstractmethod
    def getShape(self, batch: pyglet.graphics.Batch):
        pass

    @abc.abstractmethod
    def tick(self):
        pass

    @abc.abstractmethod
    def getWidth(self):
        pass

    @abc.abstractmethod
    def getHeight(self):
        pass

I have read that this Error occurs if you have indentation mistakes in your application. I have searched my whole project for mistakes but found none. I have also used the in-built "Convert Indentation to Spaces" function of Visual Studio Code on every python file in my project.

Full Traceback:

Traceback (most recent call last):
  File "C:\Users\Noah\Desktop\coding\projects\python-game\main.py", line 4, in <module>
    Launcher()
  File "C:\Users\Noah\Desktop\coding\projects\python-game\Game\Launcher.py", line 6, in __init__
    self.game = Game.Game(title="Game", width=500, height=500)
  File "C:\Users\Noah\Desktop\coding\projects\python-game\Game\Game.py", line 34, in __init__
    self.entityManager = EntityManager(self.handler)
  File "C:\Users\Noah\Desktop\coding\projects\python-game\Entities\EntityManager.py", line 28, in __init__
    self.addEntity(Player("Player", center[0], center[1], self.handler, True))
  File "C:\Users\Noah\Desktop\coding\projects\python-game\Entities\Player.py", line 19, in __init__
    super().__init__(name, x, y, handler, dN)
  File "C:\Users\Noah\Desktop\coding\projects\python-game\Entities\Entity.py", line 24, in __init__
    self.hitbox = HitBox(self, hitboxMarginX, hitboxMarginY)
  File "C:\Users\Noah\Desktop\coding\projects\python-game\Entities\HitBox.py", line 8, in __init__
    self.width = entity.getWidth()
  File "C:\Users\Noah\Desktop\coding\projects\python-game\Entities\Player.py", line 83, in getWidth
    return self.radius * 2
AttributeError: 'Player' object has no attribute 'radius'

>Solution :

Your problem is here:

@Entity.register
class Player(Entity):

    def __init__(self, name, x, y, handler, dN=False):
        super().__init__(name, x, y, handler, dN)
        self.speed = 2
        self.radius = 5

super().__init__() is called first in the Player constructor.

That means Entity.__init__() runs before anything else in Player.__init__ including self.radius = 5.

This wouldn’t be a problem but self.hitbox = HitBox(self, hitboxMarginX, hitboxMarginY) is called in Entity.__init__().

This also wouldn’t be a problem but according to your traceback:

  File "C:\Users\Noah\Desktop\coding\projects\python-game\Entities\Entity.py", line 24, in __init__
    self.hitbox = HitBox(self, hitboxMarginX, hitboxMarginY)
  File "C:\Users\Noah\Desktop\coding\projects\python-game\Entities\HitBox.py", line 8, in __init__
    self.width = entity.getWidth()
  File "C:\Users\Noah\Desktop\coding\projects\python-game\Entities\Player.py", line 83, in getWidth
    return self.radius * 2

That causes entity.getWidth() to be called which accesses self.radius and at this point, self.radius is not set yet.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading