Python: self .__ class__ vs. type (self)

ы вы ни придумали этот интересный (по крайней мере для меня) пример.

import numpy as np


class Something(object):
    a = np.random.randint(low=0, high=10)

    def do(self):
        self.a += 1
        print(self.a)

if __name__ == '__main__':
    something = Something()
    print(something.__str__())
    something.do()
    something2 = Something()
    print(something2.__str__())
    something2.do()
    something3 = Something()
    print(something3.__str__())
    something3.do()

Выше напечатано следующее в консоли:

$ python test.py
<__main__.Something object at 0x7f03a80e0518>
1
<__main__.Something object at 0x7f03a80cfcc0>
1
<__main__.Something object at 0x7f03a80cfcf8>
1

Я немного запутался, потому что я (ошибочно) принял значениеa увеличилось бы.

Я могу получить поведение, которое я ожидаю, если я использую@classmethod декоратор.

import numpy as np


class Something(object):
    a = np.random.randint(low=0, high=10)

    @classmethod
    def do(cls):
        cls.a += 1
        print(cls.a)

if __name__ == '__main__':
    something = Something()
    print(something.__str__())
    something.do()
    something2 = Something()
    print(something2.__str__())
    something2.do()
    something3 = Something()
    print(something3.__str__())
    something3.do()

Это правильно печатает следующее в консоли.

python test.py
<__main__.Something object at 0x7faac77becc0>
3
<__main__.Something object at 0x7faac77becf8>
4
<__main__.Something object at 0x7faac77c3978>
5

Теперь мне интересно в первом примере, когда я звонюself.aчто я получаю? Это не переменная класса, так как я не могу изменить ее значение. Это также не переменная экземпляра, так как она, похоже, является общей для разных объектов одного и того же класса. Как бы вы назвали это?

Это переменная класса, которую я использую неправильно? Я знаюcls имя, если соглашение, так что, возможно, я действительно обращаюсь к переменной класса, но я не могу изменить ее значение, потому что я не украсил метод с помощью@classmethod декоратор.

Является ли это незаконным использованием языка? Я имею в виду то, что лучше не делать, чтобы избежать появления ошибки на более поздней стадии?

Ответы на вопрос(2)

Ваш ответ на вопрос