[Python-de] super()?

Christian Tanzer tanzer at swing.co.at
Fri Sep 6 19:06:37 EDT 2002


martin at v.loewis.de (Martin v. Loewis) wrote:

> tanzer at swing.co.at (Christian Tanzer) writes:
>
> > 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?
>
> Sowas in der Art. Es hat nichts mit super zu tun:
>
> >>> class A:
> ...   def foo(self):pass
> ...
> >>> class B(A):pass
> ...
> >>> b=B()
> >>> b.foo
> <bound method B.foo of <__main__.B instance at 0x402dc30c>>
>
> Das wiederum liegt daran, dass b.foo.im_class nun B ist. Das liegt
> an den Deskriptoren: b.foo ist nun (falls b.__dict__['foo'] scheitert)
>
> b.__class__.foo.__get__(b, B)
>
> Wenn man an __get__ *nicht* B übergeben würde, wären Klassenmethoden
> nicht möglich.

Das ist ja schön und gut. Es leuchtet mir trotzdem noch nicht ein (ich
habe die Pythonsource dazu nicht gelesen). In meinem ursprünglichen
Beispiel hatten wir die mro (D, B, A, R, object). `super(D,d).save`
liefert also eine bound method, deren Code aus `B` (oder weiter hinten
im mro) stammt. Der Deskriptor für diese bound method kann anhand
im_self.__class die Klasse die Instanz feststellen. Warum kann er dann
nicht im im_class die Klasse ablegen, in der die bound method
tatsächlich definiert wird. Backward compatibility wahrscheinlich
<seufz>.

In jedem Fall finde ich die repr ziemlich irreführend.

Ich hätte jedenfalls erwartet, statt

    >>> 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>>

etwas wie

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

zu sehen. Das zeigt auf einen Blick den wirklichen Sachverhalt. So wie
Python das jetzt ausgibt, muß man erst mühsam
`super(D,d).save.im_func` mit allen unbound methods `save` in der
Klassenhierarchie vergleichen, um herauszufinden, was als nächstes
drankommt. Da kann ich es gleich in der Source nachlesen <wink>.

Und-außerdem-hätte-es-so-ein-schönes-Beispiel-für-
  Introspektion-als-Python-Lernhilfe-geliefert,

Christian

-- 
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