Python: utilisez toujours __new__ au lieu de __init__?
-
01-10-2019 - |
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.
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