Python __init__ de retour de l'échec de la création
Tout d'abord, je sais que le __init__()
fonction d'une classe en Python ne peut pas retourner une valeur, si malheureusement cette option n'est pas disponible.
En raison de la structure de mon code, il est logique d'avoir des données affirmations (et demande à l'utilisateur de donner de l'information) à l'intérieur de la __init__
fonction de la classe. Toutefois, cela signifie que la création de l'objet peut échouer, et je voudrais être en mesure de récupérer gracieusement.
Je me demandais quelle est la meilleure façon de continuer avec ce qui est. J'ai réfléchi à la configuration d'un booléen comme un " valide la construction du pavillon, mais je préfère ne pas le faire.
Toutes les autres idées (en plus de la restructuration de sorte assertions peuvent se produire en dehors de l'initialisation et des valeurs en tant qu'arguments)? Je suis fondamentalement à la recherche d'un moyen de renvoyer 0 en cas de succès et renvoie -1 en cas d'échec lors de l'initialisation. (Comme la plupart C des appels système)
De retour 0 en cas de succès et -1 en cas d'échec est très anti-Pythonic. Erreur retours sont mauvais, parce qu'ils sont faciles à ignorer, et détaillé au niveau de la poignée. En plus de cela, à l'aide de 0 et -1 comme valeur ajoute de la confusion avec aucun avantage. Ne pas utiliser Python pour écrire du code C.
@Jsbueno le souligne dans sa réponse, les instances de classe sont initialisé dans
__init__()
, non pas créé, c'est pourquoi il n'est pas return
une valeur. Au lieu d'utiliser une variable globale pour détecter les pannes de faire ceci ou lancer une exception, vous pouvez ajouter un membre à votre classe pour indiquer son état, puis vérifiez sa valeur, directement ou appeler une méthode qui retourne sa valeur après __init__()
a été appelé à déterminer si quoi que ce soit (et éventuellement ce) lorsqu'il a tort.
OriginalL'auteur Philip Massey | 2013-06-27
Vous devez vous connecter pour publier un commentaire.
Vous pourrait soulever une exception lorsque assertio échec, ou, si vraiment vous ne voulez pas ou ne pouvez pas travailler avec des exceptions, vous pouvez écrire le
__new__
méthode dans vos classes -en Python,
__init__
est techniquement une "initialisation" de la méthode et il devrait remplir à il a des attributs et d'acquérir certaines des ressources et d'autres l'objet de votre aura besoin au cours de son cycle de vie - Cependant, Python n'définir une véritable constructeur, le__new__
méthode, qui est appelé avant__init__
- et contrairement à cela,__new__
en fait de retourner une valeur: le nouvellement créé (non initialisée) instance elle-même.De sorte que vous pouvez placer vos chèques à l'intérieur de
__new__
et et suffit de retourner le Néant est quelque chose échoue - sinon, retourner le résultat de l'appel à la super-classe__new__
méthode (on ne peut pas faire l'allocation de mémoire pour l'objet en pur Python, si, finalement, vous devez appeler un constructeur écrit en code natif dans une super-classe - c'est généralement leobject.__new__
dans la base de votre hiérarchie de classe.NB: En Python 2, vous devez avoir
object
la classe de base de votre hiérarchie - dans le cas contraire, non seulement__new__
n'est pas appelée, comme tout un tas de fonctionnalités ajoutées plus tard à des objets Python sera tout simplement pas travailler. En bref,class MyClass(object):
, jamaisclass MyClass:
- sauf si vous êtes sur Python3.__new__
est appelé avant__init__
. J'ai juste essayé cela, mais__new__
n'est PAS appelé lorsque je crée une instance d'une classe (Py2.7).Je l'ai trouvé. Vous avez besoin d'étendre l'objet de votre classe. Sans cela, la nouvelle ne sera pas appelé!
Pas de. Si je omettre l'objet de la classe de base,
__new__
n'est pas appelé automatiquement. Allez comprendre!Non et encore non. Mon impression n'est pas appelé, à moins que j'ai ajouter l'objet de la classe de base.
Hehe. Pas seulement moi, de tomber dans les pièges 😉 pourriez-vous ajouter une note à votre réponse, donc on peut supprimer cette discussion?
OriginalL'auteur jsbueno
Avez-vous envisagé de lever une exception? C'est la façon habituelle de signal d'un échec.
OriginalL'auteur D.Shawley