어떻게이 흥미로운 (적어도 나에게) 예제를 생각해 냈는가? 하여 콘솔에서 다음자기와 함께 클래스 변수 호출하기
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()
위의 지문이 : 나는 (잘못) a
의 값이 증가했을 것으로 가정하기 때문에
$ python test.py
<__main__.Something object at 0x7f03a80e0518>
1
<__main__.Something object at 0x7f03a80cfcc0>
1
<__main__.Something object at 0x7f03a80cfcf8>
1
나는 조금 혼란 스러워요.
@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()
이렇게하면 콘솔에 다음 내용이 올바르게 인쇄됩니다. 내가 self.a
전화있을 때
python test.py
<__main__.Something object at 0x7faac77becc0>
3
<__main__.Something object at 0x7faac77becf8>
4
<__main__.Something object at 0x7faac77c3978>
5
지금, 나는 내가 무엇을 접근하고있어, 첫 번째 예제에서 궁금하네요? 나는 그것의 가치를 바꿀 수없는 것처럼 보이기 때문에 클래스 변수가 아니다. 이것은 같은 클래스의 다른 객체들 사이에서 공유되는 것처럼 보이기 때문에 인스턴스 변수가 아닙니다. 어떻게 부르죠?
내가 잘못 사용하고있는 클래스 변수입니까? 컨벤션이라면 cls
이라는 이름을 알고 있습니다. 클래스 변수에 실제로 액세스하고 있습니다. 그러나 @classmethod
데코레이터를 사용하여 메소드를 꾸미지 않았기 때문에 값을 변경할 수 없습니다.
일종의 비공식적 인 언어 사용입니까? 나중에 버그를 피하기 위해하지 않는 것이 가장 좋습니다.