Atributos de inicialización / statement en la clase Python: ¿dónde colocarlos?

Me preguntaba cuál era la mejor práctica para inicializar atributos de objetos en Python, en el cuerpo de la clase o dentro de la función __init__ ?

es decir

 class A(object): foo = None 

vs

 class A(object): def __init__(self): self.foo = None 

Si desea que todas las instancias de la clase compartan el atributo, use un atributo de clase:

 class A(object): foo = None 

Esto hace que ('foo',None) sea ​​un par (key,value) en A.__dict__ .

Si desea que el atributo sea personalizable por instancia, use un atributo de instancia:

 class A(object): def __init__(self): self.foo = None 

Esto hace que ('foo',None) sea ​​un par (key,value) en a.__dict__ donde a=A() es una instancia de A

Los atributos definidos en la definición de clase se consideran variables de clase (como las variables estáticas en Java), mientras que los establecidos en el inicializador son atributos de instancia (tenga en cuenta la diferencia entre self.something = 1 y something = 1 ). Vea esta pregunta para más detalles, y esta para aún más. No hay mucha diferencia práctica entre estos dos casos, ya que la definición de nivel de clase otorga al atributo un valor predeterminado, pero si desea usar algún tipo de lógica para establecer un atributo antes de usar una instancia de objeto, debe hacerlo en El __init__() .