En Python, considérez que j'ai le code suivant:
>>> class SuperClass(object):
def __init__(self, x):
self.x = x
>>> class SubClass(SuperClass):
def __init__(self, y):
self.y = y
# how do I initialize the SuperClass __init__ here?
Comment initialiser le SuperClass __init__
dans la sous-classe? Je suis le tutoriel Python et cela ne couvre pas cela. Lorsque j'ai cherché sur Google, j'ai trouvé plus d'une façon de faire. Quelle est la manière standard de gérer cela?
__init__
.À partir de python 3.5.2, vous pouvez utiliser:
https://docs.python.org/3/library/functions.html#super
la source
Utilisez un
super
objet pour vous assurer d'obtenir la méthode suivante (en tant que méthode liée) dans l'ordre de résolution de la méthode. Dans Python 2, vous devez passer le nom de la classe etself
à super pour rechercher la__init__
méthode liée :Dans Python 3, il y a un peu de magie qui rend les arguments
super
inutiles - et comme avantage secondaire, cela fonctionne un peu plus vite:Le codage en dur du parent comme celui-ci ci-dessous vous empêche d'utiliser l'héritage multiple coopératif:
Notez que
__init__
peut uniquement renvoyerNone
- il est destiné à modifier l'objet sur place.Quelque chose
__new__
Il existe un autre moyen d'initialiser les instances - et c'est le seul moyen pour les sous-classes de types immuables en Python. Il est donc nécessaire si vous souhaitez sous
str
- classer outuple
ou un autre objet immuable.Vous pourriez penser que c'est une méthode de classe car elle obtient un argument de classe implicite. Mais c'est en fait une méthode statique . Donc , vous devez appeler
__new__
aveccls
explicitement.Nous renvoyons généralement l'instance à partir de
__new__
, donc si vous le faites, vous devez également appeler votre base__new__
viasuper
également dans votre classe de base. Donc, si vous utilisez les deux méthodes:Python 3 évite un peu la bizarrerie des super appels causés par le fait d'
__new__
être une méthode statique, mais vous devez toujours passercls
à la__new__
méthode non liée :la source