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
декоратор.
Является ли это незаконным использованием языка? Я имею в виду то, что лучше не делать, чтобы избежать появления ошибки на более поздней стадии?