Question

Je comprends comment les deux travaux de __init__ et __new__. Je me demande s'il y a quelque chose __init__ peut faire __new__ ne peut pas?

i.e.. peut utiliser des __init__ est remplacé par le motif suivant:

class MySubclass(object):
    def __new__(cls, *args, **kwargs):
        self = super(MySubclass, cls).__new__(cls, *args, **kwargs)
        // Do __init__ stuff here
        return self

Je demande que je voudrais faire cet aspect de Python OO meilleur ajustement dans ma tête.

Était-ce utile?

La solution 2

Une réponse possible de guido de poster (merci @ fraca7):

  

Par exemple, dans le module pickle, __new__ est utilisé pour créer des instances lorsque des objets Désérialisation. Dans ce cas, les cas sont créés, mais la méthode __init__ ne puisse être retenue.

Les autres réponses similaires?


Je suis d'accepter cette réponse comme « oui » à ma propre question:

  

Je me demande s'il y a quelque chose __init__ peut faire __new__ ne peut pas?

Oui, à la différence __new__, les actions que vous avez dans la méthode __init__ ne sera pas effectuée au cours du processus dépicklage. __new__ ne peut pas faire cette distinction.

Autres conseils

Ainsi, la classe d'une classe est généralement type, et lorsque vous appelez Class() la méthode __call__() sur les poignées de classe de Class que. Je crois type.__call__() est mis en œuvre plus ou moins comme ceci:

def __call__(cls, *args, **kwargs):
    # should do the same thing as type.__call__
    obj = cls.__new__(cls, *args, **kwargs)
    if isinstance(obj, cls):
        obj.__init__(*args, **kwargs)
    return obj

La réponse à votre question est non, les choses qui __init__() peut faire (changement / « initialize » une instance spécifiée) est un sous-ensemble des choses qui __new__() peut faire (créer ou autrement sélectionner tout objet qu'il veut, faire quoi que ce soit à cet objet qu'il veut avant que l'objet est retourné).

Il est pratique d'avoir les deux méthodes à utiliser, cependant. L'utilisation de __init__() est plus simple (il ne dispose pas de créer quoi que ce soit, il ne doit pas retourner quoi que ce soit), et je crois qu'il est préférable d'utiliser toujours __init__() sauf si vous avez une raison spécifique à l'utilisation __new__().

Eh bien, à la recherche __new__ vs __init__ sur google m'a montré ce .

Longue histoire courte, __new__ retourne une nouvelle instance d'objet, alors que les revenus __init__ rien et initialisera uniquement les membres de la classe.

EDIT:. Pour répondre effectivement à votre question, vous ne devriez jamais besoin de modifier __new__ à moins que vous sous-classement types immuables

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top