Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 클래스 스코프의 전역 변수를 정의하는 올바른 방법

파이썬에서 클래스 내부에 변수를 선언하면 이를 클래스 속성(class attribute)이라고 부르며, 클래스 자체와 그 클래스의 모든 인스턴스가 함께 공유하게 됩니다. 마치 클래스 범위(class scope)에서 정의된 전역 변수처럼 동작하는 셈입니다.

핵심 개념

  • 클래스 속성은 클래스명.변수명으로 접근할 수 있습니다.
  • 인스턴스를 통해서도 읽을 수 있지만, 인스턴스에 값을 대입하면 클래스 속성이 변경되는 것이 아니라 인스턴스에 새로운 속성이 생성됩니다.
  • 클래스 속성 자체를 변경하려면 반드시 클래스 이름을 통해 접근해야 합니다.

예제 코드

class Foo(object):
    bar = 2  # 클래스 속성(클래스 범위의 공유 변수)

foo = Foo()
print(Foo.bar)   # 클래스를 통한 접근
print(foo.bar)   # 인스턴스를 통한 접근

# foo.bar에 값을 대입하면 클래스 속성 bar는 변경되지 않고,
# 인스턴스에 별도의 bar 속성이 새로 생성됩니다.
foo.bar = 3
print(Foo.bar)
print(foo.bar)

# 클래스 속성을 실제로 변경하려면 클래스 이름을 통해 접근해야 합니다.
Foo.bar = 4
print(Foo.bar)
print(foo.bar)

실행 결과

2 2 2 3 4 3

결과 분석

출력 결과를 단계별로 살펴보면 다음과 같습니다.

  1. 2 2 — 처음에는 클래스와 인스턴스 모두 같은 클래스 속성 bar = 2를 참조합니다.
  2. 2 3foo.bar = 3 실행 후, 인스턴스 foo에는 자체 속성 bar = 3이 생성되지만 클래스 속성은 여전히 2입니다.
  3. 4 3Foo.bar = 4로 클래스 속성을 변경하면 클래스 값은 4가 되지만, 인스턴스 foo는 이미 자신만의 bar = 3을 가지고 있으므로 그대로 3을 출력합니다.

정리

파이썬에서 클래스 범위의 공유 변수를 정의하려면 클래스 본문 안에 직접 변수를 선언하면 됩니다. 다만 값을 읽을 때는 인스턴스를 통한 접근이 가능하지만, 값을 쓰거나 변경할 때는 반드시 클래스 이름(Foo.bar)을 통해 접근해야 한다는 점을 기억하세요. 인스턴스를 통해 대입하면 의도와 달리 인스턴스 속성이 새로 만들어져 클래스 속성과 불일치가 발생할 수 있습니다.