2017-07-15 2 views
2

(avec Python 2.7)Python - TypeError: objet 'int' est pas appelable

Bonjour,

J'ai deux version d'un PairOfDice de classe.

1.) Celui-ci ne fonctionne pas et renvoie une erreur.

TypeError: 'int' object is not callable

import random 

class PairOfDice: 
    """ Represent the Pair of Dices and have method which tells the total of those roles. 
    """ 
    def roll(self): 
     self.total = random.randint(1, 6) + random.randint(1, 6) 

    def total(self): 
     return self.total 

    def name(self, name): 
     self.name = name 

    def getName(self): 
     return self.name 

player1 = PairOfDice() 
player1.roll() 
print player1.total() 

2) Celui-ci fonctionne.

import random 

class PairOfDice: 
    """ Represent the Pair of Dices and have method which tells the total of those roles. 
    """ 
    def roll(self): 
     self.roll1 = random.randint(1, 6) 
     self.roll2 = random.randint(1, 6) 

    def total(self): 
     return self.roll1 + self.roll2 

    def name(self, name): 
     self.name = name 

    def getName(self): 
     return self.name 

player1 = PairOfDice() 
player1.roll() 
print player1.total() 

peut plaire à quelqu'un d'expliquer ce qui ne va pas avec le premier?

Merci

+1

L'attribution d'une valeur à 'self.total' remplace la méthode' self.total'; vous appelez ce numéro dans la dernière ligne du premier exemple. Une instance de classe a seulement un espace de noms, y compris les valeurs et les méthodes. – jasonharper

Répondre

3

Dans la première classe total est une fonction ainsi qu'un attribut de la classe. Ce n'est pas correct :) Python pense que le total auquel vous faites référence dans la dernière ligne est la variable entière et non la fonction.

Il est considéré comme une bonne pratique de nommer la fonction total comme get_total au lieu

2

Ceci est parce que vous avez une propriété appelée totale, ainsi qu'une fonction appelée total. Lorsque vous exécutez roll, vous remplacez la définition de classe de total. En d'autres termes, avant d'exécuter roll, player1.total est une fonction. Cependant, une fois que vous avez exécuté le jet, vous avez défini player1.total comme étant un nombre. À partir de ce moment-là, lorsque vous faites référence à player1.total, vous faites référence à ce nombre.

Vous voudrez peut-être renommer la fonction total en quelque chose comme getTotal, ou quelque chose de similaire.