После того, как вы присвоите ему экземпляр класса, появится атрибут класса с именем a
и атрибут экземпляра с именем a
. Я иллюстрирую:
>>> class Foo(object):
... a = 10
...
>>> c = Foo()
>>> c.a
10
>>> c.a = 100 # this doesn't have to be done in a method
>>> c.a # a is now an instance attribute
100
>>> Foo.a # that is shadowing the class attribute
10
>>> del c.a # get rid of the instance attribute
>>> c.a # and you can see the class attribute again
10
>>>
Разница в том, что одна существует как запись в Foo.__dict__
, а другая существует как запись в c.__dict__
. При доступе к instance.attribute
возвращается instance.__dict__['attribute']
, если он существует, а если нет, то проверяется type(instance).__dict__['attribute']
. Затем проверяются суперклассы класса, но это немного усложняется.
Но, во всяком случае, главное в том, что это не обязательно должен быть один или другой. И класс, и экземпляр могут иметь разные атрибуты с одинаковыми именами, поскольку они хранятся в двух разных диктетах.