omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    OOP Inheritance Problem

    Pythonista
    pythonista oop
    2
    2
    1803
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • craigmrock
      craigmrock last edited by

      Thinking I set up this inheritance structure right, but getting an error that “ init() takes 1 positional argument but 15 were given.” Any thoughts?

      import random
      
      #Player Info
      class Player:
      	def __init__ (self, name, race, subrace, age, subclass,hair, eyes, height, weight, strength, speed, intelligence, knowledge, attack, defense,**kwargs):
      		
      		for key,value in kwargs.items():
      			setattr(self,key,value)
      		
      		self.name = name
      		self.race = race
      		self.subrace = subrace
      		self.age = age
      		self.subclass = subclass
      		self.hair = hair
      		self.eyes = eyes
      		self.height = height
      		self.weight = weight
      		self.strength = random.randint(6,18)
      		self.speed = random.randint(6,18)
      		self.intelligence = random.randint(6,18)
      		self.knowledge = random.randint(6,18)
      		self.attack = random.randint(2,6)
      		self.defense = random.randint(2,6)
      		
      		
      	def __str__ (self):
      		return ("Name: {}, Race: {}, Subrace: {}, Age: {}, Subclass: {}, Hair: {}, Eyes: {}, Height: {}, Weight:{}, Strength: {}, Speed: {}, Intelligence: {}, Knowledge: {}, Attack: {}, Defense: {}").format(self.name,self.race,self.subrace,
      		self.age,self.subclass,self.hair,self.eyes,
      		self.height,self.weight,self.strength, self.speed,self.intelligence,self.knowledge,
      		self.attack,self.defense)
      	
      p1 = Player("Rob", "Human", "Hunter", "25", "none", "Brown", "Green", "72in","185"," "," "," "," "," "," ")
      print(p1)
      		
      #Special Classes for Players
      class Vampire(Player):
      		def __init__ (self):
      			data = {
      				"strength": random.randint(14,18),
      				"speed": random.randint(14,18),
      				"intelligence": random.randint(14,18),
      				"knowledge": random.randint(14,18)
      			}
      			super().__init__(**data)
      		
      p2 = Vampire("Jon", "Vampire", "Archaea", "500", "none", "Black", "Red", "84in","225"," "," "," "," "," ")
      print(p2)
      
      1 Reply Last reply Reply Quote 0
      • JonB
        JonB last edited by

        I think your Vampire init needs to look like

        def __init__(self, *args, **kwargs):
            super().__init__(self,*args, **kwargs)
           #now, override defaults with class specific
            data = {
                        "strength": random.randint(14,18),
                        "speed": random.randint(14,18),
                        "intelligence": random.randint(14,18),
                        "knowledge": random.randint(14,18)
                    }
            for key,value in data.items():
                    setattr(self,key,value)
        

        Your Player class probably isnt doing what you expect -- for instance, you take a named strength argument -- which you ignore. Then, you apply kwargs, such as strength. Then you overwrite it with the default.

        Your approach seems very fragile -- do you want to enforce limits by class? In that case, each class should store the min/max limits, then attributes can be checked against those limits. Then you might simply have a roll() method that goes through each attribute, and randints between the limits -- i.e one loop, not fifty bazillion places where you call randint. less chance of errors.

        1 Reply Last reply Reply Quote 0
        • First post
          Last post
        Powered by NodeBB Forums | Contributors