Reputation: 1
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
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
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
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