파이썬 클래스 속성 오류 (Python class attribute error)
-
소개
- 파이썬에서 클래스는 객체를 만들기 위한 틀이며, 클래스 내부의 변수를 속성(Attribute)이라고 한다.
- 클래스 속성은 클래스 변수로 선언하여 생성할 객체들의 속성값을 공통으로 정의할 수 있다.
- 하지만 개발을 하다보면 클래스 속성이 예기치 않게 에러를 발생시키는 경우가 있다.
- 이번 포스팅에서는 파이썬 클래스 속성 오류에 대해 자세히 살펴보고 해결 방법을 알아보도록 하자.
-
클래스 속성 오류
- 파이썬 클래스 속성 오류 중 가장 많이 발생하는 것은 인스턴스 변수(Instance variable)와 클래스 변수( Class variable)의 혼용이다.
- 클래스 변수는 모든 인스턴스에서 공유된다는 것을 알아야 한다.
-
예시를 살펴보자.
“`python
class TestClass:
class_val = []def add_val(self, val): self.class_val.append(val)
test1 = TestClass()
test2 = TestClass()test1.add_val(1)
print(test1.class_val) # [1]
print(test2.class_val) # [1]test2.add_val(2)
print(test1.class_val) # [1, 2]
print(test2.class_val) # [1, 2]
“` -
위 코드에서는 TestClass라는 클래스를 정의하고 class_val이라는 클래스 변수를 선언하였다.
- add_val 메소드를 통해 class_val에 값을 추가하였을 때, 모든 인스턴스에서 공유가 되는 것을 확인할 수 있다.
-
그러나 인스턴스 변수와 클래스 변수를 혼동하여 클래스 변수가 아닌 인스턴스 변수로 선언할 경우 문제가 발생한다.
“`python
class TestClass:
class_val = []def __init__(self): self.instance_val = [] def add_val(self, val): self.instance_val.append(val)
test1 = TestClass()
test2 = TestClass()test1.add_val(1)
print(test1.instance_val) # [1]
print(test2.instance_val) # []test2.add_val(2)
print(test1.instance_val) # [1]
print(test2.instance_val) # [2]
“` -
위 코드에서는 인스턴스 변수인 instance_val을 클래스 변수인 class_val로 잘못 선언하였다.
- 따라서, add_val 메소드에서 instance_val에 값을 추가하면, 각 인스턴스마다 독립적으로 값을 가지게 된다.
- 이러한 경우, 클래스 변수로 정의하였어야 하는데 인스턴스 변수로 선언하여 오류가 발생한 것이다.
-
해결 방법
- 클래스 변수와 인스턴스 변수를 혼용할 때, 클래스 변수로 정의할 변수는 클래스 이름으로 접근할 수 있도록 해주는 것이 좋다.
- 즉, TestClass.class_val과 같이 클래스 이름으로 접근하면 인스턴스 변수와 혼동할 일이 없게 된다.
- 또한, 클래스 변수를 초기화할 때 주의하여야 한다.
-
다음과 같이 클래스 변수에 대한 오버라이딩이 발생하면 예기치 않은 결과를 초래할 수 있다.
“`python
class TestClass:
class_val = []def __init__(self): self.instance_val = [] def add_val(self, val): self.class_val = [val]
test1 = TestClass()
test2 = TestClass()test1.add_val(1)
print(test1.class_val) # [1]
print(test2.class_val) # []test2.add_val(2)
print(test1.class_val) # [1]
print(test2.class_val) # [2]
“` -
위 코드에서는 add_val 메소드에서 클래스 변수 class_val에 대해 오버라이딩이 발생한다.
- 따라서, 클래스 변수를 변경하였지만 각 인스턴스에서는 공유된 클래스 변수를 유지하고 있다.
- 이러한 경우, 클래스 변수를 초기화할 때 append 메소드가 아닌 대입 연산자를 사용하여 초기화를 해주어야 한다.
-
결론
- 파이썬 클래스 속성 오류는 클래스 변수와 인스턴스 변수의 혼용, 클래스 변수의 초기화 오류 등이 발생할 수 있다.
- 이러한 오류를 방지하기 위해서는 클래스 변수와 인스턴스 변수를 구분하여 선언하는 것이 중요하다.
- 클래스 변수를 초기화할 때도 조심하여야 하며, 대입 연산자를 사용하여 초기화하는 것이 좋다.
- 파이썬 클래스 속성 오류를 해결하면 안정적인 객체 지향 프로그래밍을 할 수 있으며, 유지보수에도 용이하다.