Los dos fragmentos hacen cosas diferentes, por lo que no es una cuestión de gustos, sino de cuál es el comportamiento correcto en su contexto. La documentación de Python explica la diferencia, pero aquí hay algunos ejemplos:
Anexo A
class Foo:
def __init__(self):
self.num = 1
Esto se une num
a las instancias de Foo . El cambio a este campo no se propaga a otras instancias.
Así:
>>> foo1 = Foo()
>>> foo2 = Foo()
>>> foo1.num = 2
>>> foo2.num
1
Anexo B
class Bar:
num = 1
Esto se une num
a la clase Bar . ¡Los cambios se propagan!
>>> bar1 = Bar()
>>> bar2 = Bar()
>>> bar1.num = 2
>>> bar2.num
1
>>> Bar.num = 3
>>> bar2.num
3
>>> bar1.num
2
>>> bar1.__class__.num
3
Respuesta real
Si no necesito una variable de clase, pero solo necesito establecer un valor predeterminado para mis variables de instancia, ¿son ambos métodos igualmente buenos? ¿O uno de ellos más 'pitónico' que el otro?
El código en la exhibición B es completamente incorrecto para esto: ¿por qué querría vincular un atributo de clase (valor predeterminado en la creación de la instancia) a la instancia única?
El código de la exhibición A está bien.
Si desea dar valores predeterminados, por ejemplo, variables en su constructor, sin embargo, haría esto:
class Foo:
def __init__(self, num = None):
self.num = num if num is not None else 1
...o incluso:
class Foo:
DEFAULT_NUM = 1
def __init__(self, num = None):
self.num = num if num is not None else DEFAULT_NUM
... o incluso: (preferible, ¡pero si y solo si se trata de tipos inmutables!)
class Foo:
def __init__(self, num = 1):
self.num = num
De esta forma puedes hacer:
foo1 = Foo(4)
foo2 = Foo()
self.attr = attr or []
dentro del__init__
método. Logra el mismo resultado (creo) y sigue siendo claro y legible.