TypeError: __init__() doit retourner Aucun, pas de 'int'
Je travaille par le biais de ce tutoriel. Je travaille par le biais de ce de manière itérative. À ce point j'ai de la suite Binaire de la classe:
class Binary:
def __init__(self,value):
self.value = str(value)
if self.value[:2] == '0b':
print('a binary!')
self.value= int(self.value, base=2)
elif self.value[:2] == '0x':
print('a hex!')
self.value= int(self.value, base=16)
else:
print(self.value)
return int(self.value)
Je suis en cours d'exécution à travers une série de tests à l'aide de pytest, y compris:
def test_binary_init_hex():
binary = Binary(0x6)
assert int(binary) == 6
E TypeError: int() argument must be a string or a number, not 'Binary'
J'ai posé une question à propos de ce TypeError: int() argument doit être une chaîne de caractères ou un nombre, et non pas "Binary" et en fonction de la réponse modifié le code comme ci-dessus. Maintenant quand je lance la suite de tests à l'aide de pytest, tous les tests échoue et le message d'erreur est:
TypeError: __init__() should return None, not 'int'
Pourquoi est-il un problème?
Cette réponse n'est pas de retour
Pourquoi est-ce même une classe, et non pas seulement une fonction?
int
de __init__
. Il définit un __int__
méthode, utilisée pour la conversion numérique.__init__()
est utilisé pour initialiser des objets, afin de ne pas l'utiliser de cette façon, mais l'utilisation d'une méthode distincte pour plus tard pour ce but.Pourquoi est-ce même une classe, et non pas seulement une fonction?
OriginalL'auteur user61629 | 2016-04-16
Vous devez vous connecter pour publier un commentaire.
Avant toute réponse, je lui ai dit que vous
__init__()
est utilisé pour initialiser des objets et ainsi vous ne devez pas retourner aucune valeur à l'intérieur. Mais il est étrange de voir certains des upvoted les réponses ci-dessus a demandé de ne pas les valeurs de retour dans__init__() b
ut encore leur solution ne permet pas de respecter ce qu'ils ont dit. Seulement @CPanda n'a pas à faire le contraire de ce qu'il a dit. C'est pourquoi je veux mettre en évidence ce nouveau comme réponse:Afin de ne PAS renvoyer des valeurs à l'aide de
__init__()
!Une autre chose que je veux ajouter, même si cela n'est pas mentionné autant que je sache, dans Python Enhancement Propositions, personnellement, je n'utilisez jamais de
__init__()
pour imprimer des messages à l'aideprint''
/print('')
. Les seuls messages que j'ai l'impression en__init__()
sont ceux qui sont liés à l'augmentation des messages d'erreur d'exception dans des formes telles queraise ValueError()
(vérifier des Exceptions intégrées pour plus d'informations)OriginalL'auteur Billal Begueradj
La la documentation états:
"Parce que
__new__()
et__init__()
travailler ensemble à la construction d'objets (__new__()
pour le créer, et__init__()
pour la personnaliser), aucune non Aucune valeur peut être renvoyée par__init__()
; cela risquerait de provoquer une erreur TypeError d'être soulevées lors de l'exécution."Donc enlever que
return
déclaration et de la placer dans un__int__
méthode dans votre classe:êtes-vous confus
__int__
avec__init__
peut-être?Oooops, je vous remercie beaucoup! J'ai tout simplement mal lu
OriginalL'auteur cdarke
__init__
est appelée, après une instance a été créée avecDonc il y a moyen d'attribuer une valeur de retour à une variable, donc
__init__
ne doit pas retourner quoi que ce soit (à l'exception implicitementNone
).De passer votre test, l'objet doit avoir une méthode magique
__int__
, qui est appelé, lorsque la fonctionint
est utilisé.__int__
méthode? Donc, si je comprends bien__int__
est primordial réguliers int() construit en fonction?OriginalL'auteur Daniel
__init__
Ne peut pas renvoyer à autre chose que deNone
. C'est parce qu'il est l'initiateur de " une instance créée par__new__
, qui sont tous deux appelé implicitement lorsque vous appelez la classe appelable. Par conséquent, si vous essayez de retourner quelque chose de vous-même à partir d'elle, unTypeError
exception est levée.Solutions possibles sont refactoriser le code de méthodes ou
@property
s et de les utiliser plus tard. Si vous voulez quelque chose de plus audacieux caisse metaclasses.OriginalL'auteur C Panda
__init__
initialise une instance d'une classe (dans votre cas, une instance deBinary
). Une instance d'une classe particulière de chose spécifique type.Dans votre cas, vous semblez ne pas l'utiliser comme un type de chose mais plutôt comme un utilitaire qui intelligemment convertit des nombres. En revanche, vous pouvez probablement juste de faire une fonction:
Mais il vous manque le point de la programmation orientée objet, car ce que vous faites n'est pas un objet.
OriginalL'auteur iAdjunct