2016-04-19 14 views
0

Ich versuche, mich selbst über Super() und Klassenvererbung in Python ohne Erfolg zu unterrichten. Kann mir jemand mit dem folgenden Code sagen, warum das, was ich erwarte, nicht wahr ist?Python Klassenvererbung und Super() Verhalten?

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, ")" 

Warum ist dieser Code Ausgabe:

(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) 

Statt der erwarteten:

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

Was ist 'player', wenn man davon ausgeht, dass es sich um' Enemy' handelt? – edhurtig

+0

@edhurtig Spieler ist eine andere Instanz von Entity, ziemlich ähnlich Code zu was in der Enemy-Klasse gezeigt, aber mit anderen Mathe (kein Ziel, Daten von Basis) – user6195779

+0

Hoffentlich macht das Sinn, weil ich wenig Ahnung habe, wovon ich spreche ... Ich benutze es nur hier, um den Level des Feindes zu bestimmen und seine Attribute abhängig von diesem Level anzupassen. – user6195779

Antwort

0

Sie vorbei ein Enemy Objekt in für den Namen

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


createEnemy(Enemy("goblin", player)) 

Sie rufenan, vorbei an einer Enemy. Innerhalb von createEnemy übergeben Sie dieses feindliche Objekt als erstes Argument, um ein weiteres Enemy zu erstellen (das erste Argument sollte ein Name sein).

+0

Vielen Dank. Ihre Antwort war diejenige, die mir meinen Moment der Klarheit gab, obwohl sie den anderen sehr ähnlich ist. Aufgrund Ihres Kommentars konnte ich herausfinden, ich wollte nicht createEnemy(Enemy("goblin", player)) wollte ich createEnemy("goblin"). Ich kann nicht sagen, dass ich es besser verstehe, aber der "Fluss" beginnt mehr Sinn zu ergeben. – user6195779

1

Die enemy auf dieser Linie übergeben werden:

enemy_list.append(Enemy(enemy, player)) 

Vielleicht wollen Sie so etwas wie:

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

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

Vielen Dank. Aufgrund deines Kommentars und der Kommentare anderer konnte ich herausfinden, dass ich nicht wollte createEnemy(Enemy("goblin", player)) Ich wollte createEnemy("goblin"). Ich kann nicht sagen, dass ich es besser verstehe, aber der "Fluss" beginnt mehr Sinn zu ergeben. – user6195779

1

Sie sind nicht in einem String für name vorbei, aber ein Feind Objekt. Die Reihenfolge der Ausführung ist:

createEnemy(Enemy("goblin", player)) 

dann

enemy_list.append(Enemy(enemy, player)) 

dann

super(Enemy, self).__init__(name) 

An diesem Punkt name ist kein String, sondern ein Feind Objekt.

+0

Vielen Dank. Aufgrund deines Kommentars und der Kommentare anderer konnte ich herausfinden, dass ich nicht wollte createEnemy(Enemy("goblin", player)) Ich wollte createEnemy("goblin"). Ich kann nicht sagen, dass ich es besser verstehe, aber der "Fluss" beginnt mehr Sinn zu ergeben. – user6195779