Python类继承和super()行为?

2024-04-25 05:50:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图自学python中的super()和类继承,但没有成功。根据下面的代码,有人能告诉我为什么我期望发生的事情…不是吗?你知道吗

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

为什么此代码输出:

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

而不是预期的:

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

Tags: nameselftargetobjectinitmaindefrandom
3条回答

您正在传递一个Enemy对象作为名称

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


createEnemy(Enemy("goblin", player))

调用createEnemy,传入一个Enemy。在createEnemy内部,您传递该敌方对象作为第一个参数来创建另一个Enemy(第一个参数应该是一个名称)。你知道吗

您传递的不是name的字符串,而是一个敌方对象。执行顺序为:

createEnemy(Enemy("goblin", player))

那么

enemy_list.append(Enemy(enemy, player))

那么

super(Enemy, self).__init__(name)

此时name不是一个字符串,而是一个敌方对象。你知道吗

在此行中传入的enemy

enemy_list.append(Enemy(enemy, player))

也许你想要的是:

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

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

相关问题 更多 >