Question

Lorsque vous dérivez d'un type intégré ainsi que d'une autre classe, il semble que le constructeur du type intégré n'appelle pas le constructeur de super classe. Il en résulte que les méthodes __init__ ne soient pas appelées pour les types qui viennent après la Builtin dans le MRO.

Exemple:

class A:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print("A().__init__()")

class B(list, A):
    def __init__(self, *args, **kwargs):
        print("B().__init__() start")
        super().__init__(*args, **kwargs)
        print("B().__init__() end")

if __name__ == '__main__':
    b = B()

Dans cet échantillon, un .__ init__ n'est jamais appelé. Lorsque b est défini comme class B(A, list) Au lieu de cela - le changement de l'ordre d'héritage - il fonctionne comme prévu (c'est-à-dire un .__ init__ est appelé).

Cette dépendance très subtile à l'égard de l'ordre d'héritage semble plutôt non pythonique, est-ce destiné à cette façon? Cela signifie également que vous ne devez jamais dériver de types intégrés dans des hiérarchies de classes complexes, car vous ne pouvez pas savoir où le intégration se retrouve dans le MRO lorsque quelqu'un d'autre tire de vos cours (horreur de maintenance). Est-ce que je manque quelque chose?

Informations supplémentaires: Python version 3.1

Pas de solution correcte

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