为什么此列表返回Int而不是对象?

时间:2015-06-21 21:56:25

标签: python python-2.7

  Tcard.attack(self.players[self.opponent])
AttributeError: 'int' object has no attribute 'attack'

这是我通过致电attack()得到的错误。

Tcard = self.players[self.turn].returnCard()
Tcard.attack(self.players[self.opponent])

由于某些奇怪的原因,当Tcard.attack()使用参数self.players [self.opponent]调用时,该列表返回的是比玩家对象更多的内容。有人可以解释为什么它返回一个int而不是一个对象吗?

以下是整个文件的代码:

class Game():
    def __init__(self):
        self.players = []
        self.turn = 0
        self.opponent = 1

    def prepare_game(self):
        AI_1 = AI("AI_1", 1000)
        AI_1.generate_inventory()
        AI_2 = AI("AI_2", 1000)
        AI_2.generate_inventory()
        self.players.append(AI_1)
        self.players.append(AI_2)


    def start(self):
        p1 = self.players[self.turn]
        p2 = self.players[self.opponent]

        Tcard = self.players[self.turn].returnCard()
        print "Battle time"

        print "%s attacked %s" % (p1.Name, p2.Name)
        Tcard.attack(self.players[self.opponent])
        #switch
        if self.turn == 0:
            self.turn = 1
            self.opponent = 0
            self.start()
        else:
            self.turn = 0
            self.opponent = 1
            self.start()

这是函数returnCard所在的位置:

class AI():
    def __init__(self, Name, Health):
        self.Name = Name
        self.Health = Health
        self.inventory = []

    def generate_inventory(self):
        #Generate 6 Cards and 3 Power-ups
        #rand_powerups = random.randint(min(len(powerup)), max(len(powerup)))
        rand_cards = random.randint(0, 4)
        #self.inventory.append(rand_powerups)
        while len(self.inventory) != 4:
            self.inventory.append(rand_cards)
            if len(self.inventory) == 4:
                break



    def returnCard(self):
        return self.inventory[random.randrange(0, 4)]

3 个答案:

答案 0 :(得分:1)

   self.inventory = [] # a list


   rand_cards = random.randint(0, 4)

   self.inventory.append(rand_cards) # you add ints to the list

    # you return an int
   return self.inventory[random.randrange(0, 4)]

 # you set Tcard equal to an int  returned from ^^
 Tcard = self.players[self.turn].returnCard()

另一方面,您应该使用范围添加随机整数并继续调用randint,否则您只会将相同的数字添加到列表中:

def generate_inventory(self):
    for _ in range(4):
        self.inventory.append(random.randint(0, 4))

如果要使用类中的方法,请创建实例。我可以给你一个例子,但我不知道攻击来自哪里。

答案 1 :(得分:1)

def returnCard(self):
   return self.inventory[random.randrange(0, 4)]

returnCard会返回self.inventory的随机项。

self.inventorygenerate_inventory填充,执行此操作:

# generate a random *INT*
rand_cards = random.randint(0, 4)
while len(self.inventory) != 4:
    # append that *INT*
    self.inventory.append(rand_cards)
    # (note that this keeps adding the same number over and over)

因此,当然,returnCard将返回一个int:

Tcard = self.players[self.turn].returnCard()

因此,当您尝试调用attack时,您尝试在int:

上调用它
Tcard.attack(self.players[self.opponent])

答案 2 :(得分:1)

首先,由于这一行,Tcard成为一个变量:

Tcard = self.players[self.turn].returnCard()

通过为Tcard分配.returnCard()的结果,它始终是一个整数,因为您使returnCard()返回一个整数:

return self.inventory[random.randrange(0, 4)]

因此,由于整数不具有任何属性,因此这将是一个错误。因此,引发的错误表明int没有属性。

其次,Tcard甚至不是一个功能。只有函数可以具有属性,从而为错误添加更多内容。您需要为Tcard创建一个能够工作的函数。添加如下内容:

class Tcard:
    def attack():
        #Do something