'int' object n'est pas appelable
Je suis en train de définir un simplement Fraction
classe
Et j'obtiens cette erreur:
python fraction.py
Traceback (most recent call last):
File "fraction.py", line 20, in <module>
f.numerator(2)
TypeError: 'int' object is not callable
Le code suivant:
class Fraction(object):
def __init__( self, n=0, d=0 ):
self.numerator = n
self.denominator = d
def get_numerator(self):
return self.numerator
def get_denominator(self):
return self.denominator
def numerator(self, n):
self.numerator = n
def denominator( self, d ):
self.denominator = d
def prints( self ):
print "%d/%d" %(self.numerator, self.denominator)
if __name__ == "__main__":
f = Fraction()
f.numerator(2)
f.denominator(5)
f.prints()
Je pensais que c'était parce que j'avais numerator(self)
et numerator(self, n)
mais maintenant, je sais que Python n'a pas de surcharge de la méthode ( fonction de la surcharge), j'ai donc renommé pour get_numerator
mais ce n'est pas le problème.
Que pourrait-il être?
Comme un débutant, vous devez apprendre, qu'en Python il n'est pas nécessaire pour les méthodes getter et setter dans ces cas simples. Ayant tout juste d'attributs pour le numérateur et le dénominateur est tout simplement parfait et accepté. Et si vous voulez vraiment être explicite sur les getter et setter fonctions, vous devez faire vos attributs protégés par un trait de soulignement. De toute façon, votre nom-clash problème ne se produira pas.
OriginalL'auteur OscarRyz | 2010-04-23
Vous devez vous connecter pour publier un commentaire.
Vous utilisez
numerator
à la fois comme un nom de méthode (def numerator(...)
) et membre nom de la variable (self.numerator = n
). Utilisationset_numerator
etset_denominator
pour les noms de méthode et cela fonctionnera.En passant, la version 2.6 de Python est doté d'un fraction de la classe.
numerator
je ne peux pas avoir toute autre méthode de même nom, droite? ( un "setter" ou "getter" ou tout autre ) question Supplémentaire, j'ai eu une erreur de syntaxe quand j'ai essayé d'utiliser le nom "imprimer" pour ma méthode d'impression, donc j'ai du nom ilprints
est-ce parce queprint
est définie dans l'objet? ou parce qu'il est global ou quelque chose?Sur la fraction de la classe de grâce. Je suis en train d'apprendre, je suis en train de faire une sorte de
language showcase
avec cette classe en Python, Ruby, Allez, Java, Objective-C.Reyes: En Python 2.x
print
est un mot-clé (utilisé pour leprint
déclaration), de sorte que vous ne pouvez pas l'utiliser pour nommer vos méthodes ou variables. En Python 3.xprint
n'est pas un mot-clé plus.Mieux que de renommer le setter pour
set_numerator
serait d'utiliser propriétés à la place. Les accesseurs et mutateurs sont unpythonic.OriginalL'auteur interjay
Vous ne pouvez pas surcharger le nom
numerator
pour désigner à la fois la variable de membre et de la méthode. Lorsque vous définissezself.numerator = n
, vous êtes en écrasant la référence à la méthode, et donc, lorsque vous appelezf.numerator(2)
, il essaie de faire un appel de méthode sur la variable membre, qui est unint
, et Python ne pas vous laisser faire ça. C'est comme direx = 2; x(4)
-- il n'a tout simplement pas de sens.Vous devez renommer le setter de
set_numerator
etset_denominator
pour supprimer ce conflit de noms.OriginalL'auteur Adam Rosenfield
Vous utilisez
numerator
à la fois comme un nom de méthode et un nom pour une instance de l'attribut. Puisque les méthodes sont stockés sur la classe, lorsque vous recherche de l'attribut, vous obtenez le nombre, pas la méthode. (Python rechercher des attributs de l'instance avant de regarder la classe.)C'est-à-dire que sur la ligne où vous dites
f.numerator(2)
, il cherchef.numerator
et constate qu'il est0
, puis tente de l'appeler que0
, qui, évidemment, ne devrait pas fonctionner.Si vous avez un but pratique pour ce code, vous pouvez utiliser le stdlib
fractions
module: http://docs.python.org/library/fractions.htmlRational
type.Plus pratique valeur par défaut pour
denominator
est probablement1
. (De cette façonFraction(5)
de cinq, et non pas défini opération tendant vers l'infini.)Plutôt qu'un
prints
méthode, il serait plus typique de définir__str__
et il suffit d'imprimer votre objet.Vos méthodes sont seulement l'obtention et la configuration d'un attribut. En Python, nous ne faisons généralement pas utiliser les accesseurs et mutateurs—nous venons de permettre aux utilisateurs de définir nos attributs.
Il ne serait pas mal d'hériter
numbers.Rational
(Python 2.6 et plus), ce qui permet à votre classe automatiquement faire plusieurs choses chiffres devraient. Vous aurez à mettre en œuvre tout ce qu'il a besoin de vous, mais alors il sera automatiquement faire beaucoup plus de travail. Découvrez découvrez http://docs.python.org/library/numbers.html pour en savoir plus.Spoiler alert:
Sur les propriétés, il est également utilisé ( en Java ) pour conserver les attributs privés, de sorte que les sous-classes peuvent pas y accéder ( et probablement les tremper ). Je me suis toujours demandé: Pouvez-Python ont privé les membres? Je vois
__
partout, mais je pense que c'est juste une convention de nommage n'est-ce pas ?Gardez à l'esprit que les langages de programmation (comme les langues naturelles), parfois, ne se prêtent pas à diriger la traduction littérale. En particulier, des choses comme l'utilisation de l'accès direct aux attributs (plutôt que de les getters et setters) est la bonne façon de le faire en Python, même si ce serait anathème en Java. Cela vous emmène tout le chemin du retour à pense comme vos diagrammes UML qui, théoriquement, n'étaient pas censés avoir rien à faire avec le langage de mise en œuvre.
Privé des attributs n'existent pas en Python. La convention pour un attribut qui n'est pas partie d'une API publique est d'utiliser un seul trait de soulignement, comme
_foo
. Double trait de soulignement (et pas plus d'une fuite sous-tiret) comme__foo
nom-mangles l'attribut; certaines personnes s'en servent pour de faux privée attributs, mais il n'est pas de fournir efficacement que. Je n'utilise pas ou comme__foo
, ce qui rend mon code plus difficile à la sous-classe, à tester et à maintenir, et il n'est pas trop largement probable parmi Python personnes.En Python, les propriétés (docs.python.org/library/functions.html#property) peut être utilisé pour fournir les attributs en lecture seule et sont parfois, mais pour la plupart, cela est considéré comme erronée: si vous ne voulez pas qu'un utilisateur de modifier un attribut, ne dites pas dans votre documentation. Il ne serait probablement pas faire de sens de toute façon! Si votre utilisation n'a de toute façon, ce n'est pas votre faute, si ce n'était pas cela, suffisamment d'utilisateur idiot serait de trouver un moyen d'utiliser votre code de mal de toute façon. Essayer de contrôler ce que l'utilisateur de votre code ne avec elle, c'est une proposition perdante. En outre, nous sommes tous des adultes consentants ici.
OriginalL'auteur Mike Graham