Как уже упоминалось другими, в одном случае это атрибут класса, в другом - атрибут экземпляра. Имеет ли это значение? Да, в одном случае это так. Как сказал Алекс, если значение изменчиво. Лучшее объяснение - это код, поэтому я добавлю немного кода, чтобы показать его (на самом деле это все, что делает этот ответ):
Сначала класс, определяющий два атрибута экземпляра.
>>> class A(object):
... def __init__(self):
... self.number = 45
... self.letters = ['a', 'b', 'c']
...
А затем класс, определяющий два атрибута класса.
>>> class B(object):
... number = 45
... letters = ['a', 'b', 'c']
...
Теперь мы их используем:
>>> a1 = A()
>>> a2 = A()
>>> a2.number = 15
>>> a2.letters.append('z')
И все хорошо:
>>> a1.number
45
>>> a1.letters
['a', 'b', 'c']
Теперь используйте вариацию атрибута класса:
>>> b1 = B()
>>> b2 = B()
>>> b2.number = 15
>>> b2.letters.append('z')
И все ... хорошо ...
>>> b1.number
45
>>> b1.letters
['a', 'b', 'c', 'z']
Да, обратите внимание, что когда вы изменили, атрибут изменяемого класса изменился для всех классов. Обычно это не то, что вы хотите.
Если вы используете ZODB, вы используете много атрибутов класса, потому что это удобный способ обновления существующих объектов новыми атрибутами или добавления информации на уровне класса, которая не сохраняется. В противном случае вы можете в значительной степени игнорировать их.