[Python-de] super()?

Christian Tanzer tanzer at swing.co.at
Thu Sep 5 10:24:38 EDT 2002


Thomas Fanslau <tfanslau at gmx.de> schrieb:

> (Das folgende ist vielleicht lang, aber doch nicht unwichtig. Sollte ich
> recht haben, und Test zeigen mir, das ich nicht wirklich falsch liege,
> dann muss bei der geplanten Verwendung von super() JEDE Klasse, selbst
> wenn sie keine Basisklasse ausser 'object' hat, ein super()-Aufruf
> eingetragen werden UND jeder dieser Aufrufe muss zumindestens mit einem
> try-except geklammert werden. Oder ich lieg völlig daneben, was ich nie
> völlig ausschliesse.)
>
> Ich habe mir die Mails durchgelesen, die Dokumentation gewälzt
> (inclusive PEP 253), noch in bisschen getestet und ganz langsam kommt
> Licht in die Sache. Oder auch nicht :-(

(snip)

MvL hat bereits alles erklärt, aber ich möchte Dir noch einen
(impliziten) Tipp geben:

>>> R.mro()
[<class '__main__.R'>, <type 'object'>]
>>> A.mro()
[<class '__main__.A'>, <class '__main__.R'>, <type 'object'>]
>>> B.mro()
[<class '__main__.B'>, <class '__main__.R'>, <type 'object'>]
>>> D.mro()
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.R'>, <type 'object'>]

>>> d = D()
>>> super(D, d)
<super: <class 'D'>, <D object>>
>>> super(B, d)
<super: <class 'B'>, <D object>>
>>> super(A, d)
<super: <class 'A'>, <D object>>

    Wie Du siehst, kriegst Du jedesmal ein `super` Object zurück, das
    die gleiche Instanz, aber eine verschiedene Klasse kapselt.

    `super(X, y).attr` führt zu einem Aufruf von `super(X,
    y).__getattribute__` -- und das sucht in der `y.mro()` nach dem
    nächsten auf `X` folgenden Element, das ein Attribut mit Namen
    `attr` hat.

In solchen Fällen hilft es, eine Interpretershell zu öffnen und einfach
zu stöbern. `pydoc.help` und `dir` sind sehr hilfreich, um hinter
Python's Schliche zu kommen.

Auch wenn ich nicht verstehe, warum:

>>> super(D,d).save
<bound method D.save of <__main__.D object at 0x823592c>>
>>> super(B,d).save
<bound method D.save of <__main__.D object at 0x823592c>>
>>> super(A,d).save
<bound method D.save of <__main__.D object at 0x823592c>>

immer behauptet, `D.save` zu liefern, obwohl es in Wirklichkeit
`B.save` und `A.save` liefern muß (ein nachfolgender Aufruf zeigt
das). Verstehst Du das, Martin? Bug oder Feature?

PS: Bitte tu keine Tabulatoren in Deine Mails -- das verhindert
    Kopieren in ein xterm.

-- 
Christian Tanzer                                         tanzer at swing.co.at
Glasauergasse 32                                       Tel: +43 1 876 62 36
A-1130 Vienna, Austria                                 Fax: +43 1 877 66 92





More information about the Python-de mailing list