Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.python > #5003

Re: [Python-de] __init__ ?

From Stefan Behnel <python-de@behnel.de>
Newsgroups de.comp.lang.python
Subject Re: [Python-de] __init__ ?
Date 2017-11-04 07:43 +0100
Message-ID <mailman.224.1509779273.1490.python-de@python.org> (permalink)
References <f60n90F4clsU1@mid.individual.net> <1a70d170-695d-4592-08b3-77cda4bd5e66@behnel.de>

Show all headers | View raw


Hermann Riemann schrieb am 02.11.2017 um 15:09:
> Bisher habe ich etwas wie
> 
> class Cl():
>    def __init__(self):
>       self.x=1
> 
> gemacht.
> So wie das in Bücher üblich ist.
> 
> In einer raspberry pi Zeitschrift habe ich gesehen
> dann man stattdessen auch
> 
> class Cl():
>    x=1
> 
> schreiben kann.

Nein, das ist nicht dasselbe. Im ersten Fall setzt du ein Attribut auf der
Objekt-Instanz, also auf einer einzigen, konkreten Instanz einer Klasse. Im
zweiten Fall setzt du ein Attribut auf der Klasse, das damit auf allen
Instanzen dieser Klasse sichtbar wird. Wohlgemerkt, das *selbe* Attribut
mit dem *selben* Wert. Es gibt diesen Wert also nur genau einmal.

Den Unterschied kannst du hier sehen:

In [1]: class C: x = 1

In [2]: C().x
Out[2]: 1

In [3]: C.x = 2

In [4]: c = C()

In [5]: c.x
Out[5]: 2

In [6]: C.x = 3

In [7]: c.x
Out[7]: 3

In [8]: c.x = 4

In [9]: c.x
Out[9]: 4

In [10]: C.x = 5

In [11]: c.x
Out[11]: 4


Erst in [8] setze ich ein Attribut auf der Instanz. Ab da sind Änderungen
am Klassenattribut nicht mehr (direkt) an "c" sichtbar, weil "c.x" nun das
Instanzattribut verwendet und nicht mehr das (dahinter liegende)
Klassenattribut.

Den Hinweis, dass das vor Allem Auswirkungen bei veränderbaren
Datenstrukturen wie Listen hat, haben andere ja bereits geliefert. Es ist
ein großer Unterschied, ob eine Liste für alle Instanzen dieselbe ist, oder
ob jede Instanz eine eigene, separate Liste verwendet.

Das bedeutet übrigens nicht, dass mensch sowas nicht machen sollte. Ich
sehe es als völlig legitime Art, z.B. einen Standardwert für ein Attribut
zu definieren. Aber es hilft wie immer, die Entscheidung bewusst und
fundiert zu treffen, weil mensch sonst Gefahr läuft, Code blind zu
kopieren. Siehe z.B.

https://www.aisec.fraunhofer.de/en/stackoverflow.html

Stefan

Back to de.comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

__init__ ? Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-11-02 15:09 +0100
  Re: [Python-de] __init__ ? Thomas Güttler <guettliml@thomas-guettler.de> - 2017-11-02 15:22 +0100
    Re: [Python-de] __init__ ? Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-11-02 15:51 +0100
  Re: [Python-de] __init__ ? "Diez B. Roggisch" <deets@web.de> - 2017-11-02 15:33 +0100
    Re: Python Beispiele SDL2? (was: __init__ ?) Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-11-02 17:28 +0100
      Re: [Python-de] Python Beispiele SDL2? (was: __init__ ?) "Diez B. Roggisch" <deets@web.de> - 2017-11-02 18:10 +0100
  Re: [Python-de] __init__ ? Stefan Behnel <python-de@behnel.de> - 2017-11-04 07:43 +0100
  Re: [Python-de] __init__ ? Dinu Gherman <gherman@darwin.in-berlin.de> - 2017-11-05 18:15 +0100
  Re: [Python-de] __init__ ? "Diez B. Roggisch" <deets@web.de> - 2017-11-05 22:09 +0100
  Re: [Python-de] __init__ ? Stefan Behnel <python-de@behnel.de> - 2017-11-06 20:57 +0100
    Re: [Python-de] __init__ ? Stefan Behnel <python-de@behnel.de> - 2017-11-06 21:28 +0100
      Re: [Python-de] __init__ ? "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2017-11-06 22:29 +0100
        Re: [Python-de] __init__ ? "Peter Heitzer" <peter.heitzer@rz.uni-regensburg.de> - 2017-11-07 11:11 +0000
        Re: [Python-de] __init__ ? Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-11-12 18:37 +0100
    Re: [Python-de] __init__ ? Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-11-12 19:22 +0100

csiph-web