Я пытался понять, как Python обрабатывает переменные класса и экземпляра. В частности, я нашел этот ответ весьма полезным. В основном это говорит о том, что если вы объявите переменную класса, а затем сделаете присваивание [instance].property
, вы будете присваивать совершенно другую переменную - одну в другом пространстве имен из переменной класса.
Итак, я подумал - если я хочу, чтобы у каждого экземпляра моего класса был член с некоторым значением по умолчанию (скажем, ноль), я должен сделать это так:
class Foo:
num = 0
или как это?
class Foo:
def __init__(self):
self.num = 0
Исходя из того, что я прочитал ранее, я думаю, что во втором примере будет инициализироваться «правильная» переменная (экземпляр вместо переменной класса). Тем не менее, я считаю, что первый метод тоже работает очень хорошо:
class Foo:
num = 0
bar = Foo()
bar.num += 1 # good, no error here, meaning that bar has an attribute 'num'
bar.num
>>> 1
Foo.num
>>> 0 # yet the class variable is not modified! so what 'num' did I add to just now?
Итак ... почему это работает? Что я не получаю? FWIW, мое предварительное понимание ООП пришло из C ++, поэтому объяснение по аналогии (или указание, где оно ломается) может быть полезным.