Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Stefan Behnel Newsgroups: de.comp.lang.python Subject: Re: [Python-de] __init__ ? Date: Sat, 4 Nov 2017 07:43:32 +0100 Lines: 73 Message-ID: References: <1a70d170-695d-4592-08b3-77cda4bd5e66@behnel.de> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de R11OVAyeFChcrzvcKVuCfgFTaqYLm/N3/u4vzBoP5RyQ== Return-Path: X-Original-To: python-de@python.org Delivered-To: python-de@mail.python.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1509779271; s=domk; d=behnel.de; h=Content-Transfer-Encoding:Content-Language:Content-Type:In-Reply-To: MIME-Version:Date:From:References:To:Subject; bh=SGV4SdZFQgsmFOgPJcgaQNXFFzG9Y7KOGDLr8o5fVlA=; b=MlU/luaMoRcl7Q/PjoPwGpCTAkVsXc6MwfcllRuVzzLdlLwHowGNoraK/Mtxfap8Lu i8cJVZeNtnXJ7/ska3mmEssQELRfh85VYUG3jQ+gZW9gA03EulReYD85xMpusmwRV/FD 3w1y90hJ/3Tql8f3+aQxz9uePF5BvNXGMXemU= X-RZG-AUTH: :E1MMdFW4b++AXZOTwA41DOYM0Dv9LNWvavC/fJZ6Wfgmp/Lh1ANWCRaaq2R1hCooD/t2Vl9QPFHZv/gGfhMyKTzCI7K4Y+eL9qBSOkaDEqM8M18= X-RZG-CLASS-ID: mo00 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 In-Reply-To: Content-Language: de-DE X-BeenThere: python-de@python.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: Die Deutsche Python Mailingliste List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Mailman-Original-Message-ID: <1a70d170-695d-4592-08b3-77cda4bd5e66@behnel.de> X-Mailman-Original-References: Xref: csiph.com de.comp.lang.python:5003 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