Comment puis-je annuler création d'instance d'objet en Python?
Je veux mettre en place une classe qui va annuler pendant la création de l'instance basée sur la valeur de l'argument passé à la classe. J'ai essayé quelques choses, l'un d'entre eux étant de générer une erreur dans le __new__
méthode:
class a():
def __new__(cls, x):
if x == True:
return cls
else:
raise ValueError
C'est ce que j'espérais, allait arriver:
>>obj1 = a(True)
>>obj2 = a(False)
ValueError Traceback (most recent call last)
obj1
existe mais obj2
ne le fait pas.
Des idées?
- ne devriez-vous pas remplacer
__init__(self, ...)
à la place? - b. Ce n'est pas que sémantique si l'intention est d'arrêter la création de l'objet. Il fonctionne bien.
- Pourquoi le déclenchement d'une exception dans
__new__
être préférable d'élever un dans__init__
. Le résultat semble le même pour moi et__init__
est là où tous les autres code d'initialisation va. Pourquoi ne pas y aller ainsi? - parce que ce n'est pas initilization code. C'est construction conditionnelle code. Il semble que
__init__
ne doit lever une exception si il se heurte à la difficulté de l'initialisation de l'instance. Ici, c'est un test explicite en train de se faire. Je suis probablement juste de bien des arguties. Je dirais que si vous voulez le faire dans l'initialiseur, juste essayer de faire usage de quelquex
est et la laisser lever une exception ou passer par. - Je pense vraiment que les conseils que l'on veut donner, en général, est de traiter
__init__
comme le constructeur. Si la construction de l'objet doit être interrompu pour une raison quelconque, il suffit de soulever une exception. Primordial__new__
est très rarement nécessaire et pour tous les jours de classes normales, je pense qu'il devrait être évitée. Faire garde la classe de mise en œuvre simple.
Vous devez vous connecter pour publier un commentaire.
Lorsque vous remplacez
__new__
, n'oubliez pas d'appeler super!Simplement le retour de la classe ne comprend rien quand il était votre travail pour créer une instance. C'est ce que le super classe
__new__
méthode n', afin de prendre avantage de cela.Juste soulever une exception dans l'initialiseur:
__init__
n'est pas le constructeur, c'est l'initialiseur. Vous êtes en train de penser de__new__