Вне соображений производительности существует значительное семантическое различие. В случае атрибута класса существует всего один упомянутый объект. В instance-attribute-set-at-instantiation может быть несколько упомянутых объектов. Например
>>> class A: foo = []
>>> a, b = A(), A()
>>> a.foo.append(5)
>>> b.foo
[5]
>>> class A:
... def __init__(self): self.foo = []
>>> a, b = A(), A()
>>> a.foo.append(5)
>>> b.foo
[]
Различие - то, что атрибут на классе совместно используется всеми экземплярами. Атрибут на экземпляре уникален для того экземпляра.
При прибытии из C++, атрибуты на классе больше похожи на статические членские переменные.