Home > Mobile >  Python set class variable after calling
Python set class variable after calling

Time:11-06

I'm making a game using the pygame module and I have a player class:

class Player(pygame.sprite.Sprite):
def __init__(self, name, position, axsis, movment, idle, walk = None, jump = None):
    pygame.sprite.Sprite.__init__(self)
    self.name = name
    self.idle = idle
    self.walk = walk
    self.jump = jump
    self.image = self.idle[0]
    self.movment = movment 
    self.left, self.right  = axsis
    self.pos = vec(position[0],position[1])

I am adding my characters using json data type and trying to add animations after calling the class but i can't do it

Sample code

class Game():
    def __init__(self,json_file):
        self.player_attribute = json_file

    def character(self):
          self.npc = []
          for i in self.player_attribute:
              self.npc.append(Player(i['name'],
                                     i['position'],
                                     i['axsis'],
                                     i['movment']))
          self.animation()
          return self.npc

    def add_animation(self):
        for i in self.npc:
            i.idle = "images\ghost.png" 
    def main_loop()
        self.character

when i try this i get an error

self.image = self.idle[0] TypeError: init() missing 1 required positional argument: 'idle'

how can i add the variables of the class after calling the class

CodePudding user response:

It is not clear what the 'idle' parameter is supposed to represent in your code. However, the reason for the exception is that you are not passing any argument for 'idle' when constructing the Player object. You need something like:

          self.npc.append(Player(i['name'],
                                 i['position'],
                                 i['axsis'],
                                 i['movment'],
                                 i['idle']))

You can either do that or alternatively you can pass a default argument to the Player constructor so that, when initializing you do not need to explicitly pass idle:

class Player(pygame.sprite.Sprite):
def __init__(self, name, position, axsis, movment, idle=[1], walk = None, jump = None):

You can modify its content at a later time, however I suggest you are careful what you instantiate that object attribute as, because it might come bite you back later (type error or value error).

If it were me, I would move this out of init, or not build the object until all values and their types are known (see Builder Design Pattern).

Hope this helped :) Cheers!

  • Related