Повторное объявление переменных класса как переменных экземпляра в python

Я изучаю ООП в Python, и у меня есть запрос, связанный с переменными класса и экземпляра.

>>> class Something:
...     val = 10
...     def __init__(self):
...             self.instval = 100
...
>>> some = Something()
>>> some.val
10
>>> some.instval
100
>>> dir(some)
['__doc__', '__init__', '__module__', 'instval', 'val']
>>> some.val = 1000
>>> dir(some)
['__doc__', '__init__', '__module__', 'instval', 'val']
>>> some.val
1000
>>> Something.val
10
>>> del some.val
>>> some.val
10
>>> dir(some)
['__doc__', '__init__', '__module__', 'instval', 'val']

В этом классе у меня есть val переменная класса и instval переменная экземпляра. Я повторно объявляю переменную класса val равной 1000. Таким образом, some.val дает мне 1000, но Something.val по-прежнему дает мне 10. Когда я удаляю some.val, он возвращается к значению переменной класса.

Я знаю, что интерпретатор сначала ищет переменную на уровне экземпляра, а затем на уровне класса. Тогда что здесь происходит?

Я просмотрел некоторые ответы, я думаю, что это было наиболее подходящим, но я не полностью понял его последствия.


person twitu    schedule 13.11.2017    source источник
comment
См. stackoverflow.com/a/34126204/476. some.val = ... создает атрибут экземпляра, del some.val удаляет его.   -  person deceze♦    schedule 13.11.2017
comment
@deceze Возможно, самая важная часть ответа, на который вы ссылаетесь, это то, что если переменная класса устанавливается путем доступа к экземпляру, она переопределяет значение только для этого экземпляра. Это по существу переопределяет переменную класса и превращает ее в переменную экземпляра, интуитивно доступную только для этого экземпляра.   -  person DeepSpace    schedule 13.11.2017
comment
Это очень просто: атрибуты просматриваются вверх по иерархии, но они не устанавливаются вверх по иерархии. some.val довольно четко устанавливает атрибут для some, а не для Something.   -  person deceze♦    schedule 13.11.2017
comment
Да, ссылка выше помогла. Это развеяло мое заблуждение.   -  person twitu    schedule 13.11.2017