I due snippet fanno cose diverse, quindi non è una questione di gusti ma una questione di quale sia il comportamento giusto nel tuo contesto. Documentazione Python spiega la differenza, ma ecco alcuni esempi:
Allegato A
class Foo:
def __init__(self):
self.num = 1
Questo si lega num
alle istanze di Foo . Le modifiche a questo campo non vengono propagate ad altre istanze.
Quindi:
>>> foo1 = Foo()
>>> foo2 = Foo()
>>> foo1.num = 2
>>> foo2.num
1
Allegato B
class Bar:
num = 1
Questo si lega num
al Bar classe . Le modifiche vengono propagate!
>>> bar1 = Bar()
>>> bar2 = Bar()
>>> bar1.num = 2
>>> bar2.num
1
>>> Bar.num = 3
>>> bar2.num
3
>>> bar1.num
2
>>> bar1.__class__.num
3
Risposta effettiva
Se non ho bisogno di una variabile di classe, ma ho solo bisogno di impostare un valore predefinito per le mie variabili di istanza, entrambi i metodi sono ugualmente validi? O uno di loro più "pitonico" dell'altro?
Il codice nella mostra B è semplicemente sbagliato per questo: perché dovresti voler associare un attributo di classe (valore predefinito sulla creazione dell'istanza) alla singola istanza?
Il codice nella mostra A va bene.
Se vuoi fornire valori predefiniti per le variabili di istanza nel tuo costruttore, lo farei comunque:
class Foo:
def __init__(self, num = None):
self.num = num if num is not None else 1
...o anche:
class Foo:
DEFAULT_NUM = 1
def __init__(self, num = None):
self.num = num if num is not None else DEFAULT_NUM
... o anche: (preferibile, ma se e solo se hai a che fare con tipi immutabili!)
class Foo:
def __init__(self, num = 1):
self.num = num
In questo modo puoi fare:
foo1 = Foo(4)
foo2 = Foo()
self.attr = attr or []
all'interno del__init__
metodo. Ottiene lo stesso risultato (credo) ed è ancora chiaro e leggibile.