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 quelque x 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.
InformationsquelleAutor moorepants | 2010-10-05