user6195779
user6195779

Reputation: 1

Python class inheritance and super() behavior?

I'm attempting to teach myself about super() and class inheritance in python unsuccessfully. Given the following code, can someone tell me why what I expect to happen...isn't?

import random
enemy_list = []

class Entity(object):

    def __init__(self, name=''):
        self.name = name
        self.health = 1
        self.attack_power = .05

class Enemy(Entity):

    def __init__(self, name, target):
        super(Enemy, self).__init__(name)
        self.lvl = random.randint(target.lvl - 2, target.lvl + 2)
        self.health *= self.lvl * target.health
        self.attack_power *= self.lvl

def createEnemy(enemy):
    enemy_list.append(Enemy(enemy, player))
    return enemy_list

enemy_amount = random.randint(1, 5)
while enemy_amount > 0:
    createEnemy(Enemy("goblin", player))
    enemy_amount -= 1

for i in enemy_list:
    print "(", i.lvl, i.name, i.attack_power, i.health, ")"

Why is this code outputting:

( 2 <__main__.Enemy object at 0x7faa040b3050> 0.1 80 )
( 5 <__main__.Enemy object at 0x7faa040b30d0> 0.25 200 )
( 3 <__main__.Enemy object at 0x7faa040b3150> 0.15 120 )
( 5 <__main__.Enemy object at 0x7faa040b31d0> 0.25 200 )

Instead of the expected:

( 2 goblin 0.1 80 )
( 5 goblin 0.25 200 )
( 3 goblin 0.15 120 )
( 5 goblin 0.25 200 )

Upvotes: 0

Views: 110

Answers (3)

Markus
Markus

Reputation: 3317

You're not passing in a string for name, but an enemy object. The order of execution is:

createEnemy(Enemy("goblin", player))

then

enemy_list.append(Enemy(enemy, player))

then

super(Enemy, self).__init__(name)

At this point name is not a string but an enemy object.

Upvotes: 1

sberry
sberry

Reputation: 131968

The enemy being passed in on this line:

enemy_list.append(Enemy(enemy, player))

Perhaps you want something like:

def createEnemy(enemy_name):
    enemy_list.append(Enemy(enemy_name, player))
    return enemy_list

while enemy_amount > 0:
    createEnemy("goblin", player)
    enemy_amount -= 1

Upvotes: 1

Brendan Abel
Brendan Abel

Reputation: 37489

You're passing an Enemy object in for the name

def createEnemy(enemy):
    enemy_list.append(Enemy(enemy, player))
    return enemy_list


createEnemy(Enemy("goblin", player))

You call createEnemy, passing in an Enemy. Inside createEnemy, you pass that enemy object as the first argument to create another Enemy (the first argument should be a name).

Upvotes: 0

Related Questions