Python - 잘못된 클래스 변수의 사용
본 글은 Toptal에 올라온 Buggy Python Code: The 10 Most Common Mistakes That Python Developers Make 글을 보고 공부하면서 쓴 글이다. 번역 + 개인의 공부내용이라고 생각하면 될 것 같다.
Common Mistake #2: Using class variables incorrectly
잘못된 클래스 변수의 사용
class A(object):
x = 1
class B(A):
pass
class C(A):
pass
print A.x, B.x, C.x // 1 1 1
B.x = 2
print A.x, B.x, C.x // 1 2 1
A.x = 3
print A.x, B.x, C.x // 3 2 3
A.x
만 변경했는데 왜 C.x
가 변경되었을까? 파이썬에서, 클래스 변수는 내부적으로 dictionary 로 처리되고 Method Resolution Order(MRO) 규칙을 따른다. 위의 코드에서, C 클래스에 x 가 없기 때문에, base 클래스에서 찾아진다(Python 이 다중상속을 지원하더라도 오직 A). 다시 말하자면, C 클래스는 A 클래스와 별개로 x 를 자기자신이 가지고 있지 않다. 그러므로 C.x
의 레퍼런스는 A.x
이다. 이것을 제대로 처리 하지 않으면 문제가 발생한다. class attributes in Python를 좀 더 살펴보도록 하자.