2017-07-15 7 views
2

(mit Python 2.7)Python - Typeerror: 'int' Objekt ist nicht aufrufbar

Hallo,

Ich habe zwei Version einer Klasse PairOfDice.

1.) Dieser funktioniert nicht und gibt einen Fehler aus.

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) Dieser arbeitet.

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

Kann bitte jemand erklären, was mit dem ersten falsch ist?

Dank

+1

Das Zuweisen eines Werts zu "self.total" überschreibt die Methode 'self.total'; Sie rufen diese Nummer in der letzten Zeile des ersten Beispiels an. Eine Klasseninstanz hat nur einen Namespace, der sowohl Werte als auch Methoden enthält. – jasonharper

Antwort

3

In der ersten Klasse total ist eine Funktion, sowie ein Attribut der Klasse. Das ist nicht in Ordnung :) Python denkt, dass die Summe, auf die Sie in der letzten Zeile Bezug nehmen, die Ganzzahlvariable total und nicht die Funktion ist.

Es ist eine gute Praxis betrachtet die Funktion total als get_total statt

2

Dies ist, weil Sie eine Eigenschaft haben, zu nennen insgesamt genannt, sowie eine Funktion total genannt. Wenn Sie roll ausführen, überschreiben Sie die Klassendefinition total.

Mit anderen Worten, bevor Sie roll ausführen, ist player1.total eine Funktion. Sobald Sie jedoch roll ausführen, legen Sie player1.total als eine Zahl fest. Wenn Sie dann auf player1.total verweisen, beziehen Sie sich auf diese Nummer.

Sie könnten die total Funktion in etwas wie getTotal oder etwas ähnliches umbenennen.

Verwandte Themen