2.x python, super accepte les cas suivantsPourquoi python super n'accepte pas seulement les instances?
class super(object)
| super(type) -> unbound super object
| super(type, obj) -> bound super object; requires isinstance(obj, type)
| super(type, type2) -> bound super object; requires issubclass(type2, type)
| Typical use to call a cooperative superclass method:
pour autant que je vois, super est une classe, enveloppant le type et (éventuellement) l'instance pour résoudre la superclasse d'une classe.
Je suis un peu perplexe par deux choses:
- pourquoi il n'y a pas non plus
super(instance)
, avec une utilisation typique par exemplesuper(self).__init__()
. Techniquement, vous pouvez obtenir le type d'un objet à partir de l'objet lui-même, de sorte que la stratégie actuellesuper(ClassType, self).__init__()
est en quelque sorte redondante. J'assume des problèmes de compatibilité avec les classes de style ancien, ou héritage multiple, mais j'aimerais entendre votre point de vue. - pourquoi, d'autre part, python 3 acceptera (voir Understanding Python super() with __init__() methods)
super().__init__()
? Je vois un peu de magie en cela, violant l'explicite est mieux que le Zen implicite. J'aurais vu plus appropriéself.super().__init__()
.
Je suppose que vous vouliez dire classe B (A): et classe C (B): –
Cependant, vous avez raison. Il ne serait jamais capable d'appeler A .__ init __() de B, car dans la méthode B .__ init __() self serait de type C, dont super direct est B, pas A. Donc B .__ init __() serait appelé à nouveau. –
ah vous avez raison sur la faute de frappe, merci! Et cela devient encore plus compliqué dans les systèmes d'héritage multiple, je pense que je peux trouver un lien à ce sujet. – u0b34a0f6ae