Die beiden Schnipsel machen unterschiedliche Dinge, es ist also keine Frage des Geschmacks, sondern des richtigen Verhaltens in Ihrem Kontext. Die Python-Dokumentation erklärt den Unterschied, aber hier sind einige Beispiele:
Anlage A.
class Foo:
def __init__(self):
self.num = 1
Dies bindet num
an die Foo- Instanzen . Änderungen an diesem Feld werden nicht an andere Instanzen weitergegeben.
So:
>>> foo1 = Foo()
>>> foo2 = Foo()
>>> foo1.num = 2
>>> foo2.num
1
Anlage B.
class Bar:
num = 1
Dies bindet num
an die Bar- Klasse . Änderungen werden weitergegeben!
>>> bar1 = Bar()
>>> bar2 = Bar()
>>> bar1.num = 2 #this creates an INSTANCE variable that HIDES the propagation
>>> bar2.num
1
>>> Bar.num = 3
>>> bar2.num
3
>>> bar1.num
2
>>> bar1.__class__.num
3
Aktuelle Antwort
Wenn ich keine Klassenvariable benötige, sondern nur einen Standardwert für meine Instanzvariablen festlegen muss, sind beide Methoden gleich gut? Oder einer von ihnen "pythonischer" als der andere?
Der Code in Exponat B ist dafür eindeutig falsch: Warum sollten Sie ein Klassenattribut (Standardwert bei der Instanzerstellung) an die einzelne Instanz binden?
Der Code in Exponat A ist in Ordnung.
Wenn Sie in Ihrem Konstruktor Standardeinstellungen für beispielsweise Variablen angeben möchten, würde ich dies jedoch tun:
class Foo:
def __init__(self, num = None):
self.num = num if num is not None else 1
...oder auch:
class Foo:
DEFAULT_NUM = 1
def __init__(self, num = None):
self.num = num if num is not None else DEFAULT_NUM
... oder sogar: (vorzuziehen, aber genau dann, wenn es sich um unveränderliche Typen handelt!)
class Foo:
def __init__(self, num = 1):
self.num = num
So können Sie vorgehen:
foo1 = Foo(4)
foo2 = Foo() #use default
self.attr = attr or []
innerhalb der__init__
Methode. Es erzielt das gleiche Ergebnis (glaube ich) und ist immer noch klar und lesbar.