Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.python > #5003
| 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> |
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 | Next — Previous in thread | Next in thread | Find similar
__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