HOWTO · Python

Python에서 클래스 전역 변수 정의

Python 클래스 속성을 클래스 본문에 정의하고 ClassName.attribute로 액세스하는 방법과, global로 선언된 모듈 수준 이름과 구별하는 방법을 알아봅니다.

이 페이지의 내용

Python 클래스 변수는 클래스 본문에서 할당하는 속성입니다. 클래스에 한 번 정의한 다음 Tesla.speed처럼 ClassName.attribute 형식으로 읽습니다. global 이름은 이와 별개로 모듈 네임스페이스에 속하며 클래스 속성이 되지 않습니다.

Python에서 클래스 변수 정의하기

클래스 본문에 값을 할당한 뒤 클래스 이름으로 읽습니다. 예제에서는 메서드와 두 번째 클래스도 같은 속성을 읽는 모습을 보여 줍니다.

class Tesla:
    speed = 60

    def show_speed(self):
        return Tesla.speed


class Dashboard:
    def show_tesla_speed(self):
        return Tesla.speed


print(Tesla.speed)
print(Tesla().show_speed())
print(Dashboard().show_tesla_speed())
60
60
60

여기서 speed는 Tesla에 저장되므로 Tesla.speed는 공유 클래스 속성을 읽습니다. Tesla의 메서드와 Dashboard의 메서드는 모두 같은 클래스 지정 조회를 사용합니다.

클래스 외부에서 클래스 변수에 접근하기

클래스를 사용할 수 있는 곳이라면 어디서든 ClassName.attribute 형식을 사용하면 됩니다. 예를 들어 모듈 수준의 코드나 다른 클래스의 메서드에서 Tesla.speed를 사용할 수 있습니다. 클래스 속성을 읽기 위해 인스턴스를 만들 필요는 없습니다. 클래스 밖에서 speed처럼 클래스 이름이 없는 이름을 사용해도 Tesla.speed를 가리키지 않습니다. 이 이름은 현재 범위에서 조회되므로 정의되지 않았을 수 있습니다.

인스턴스에 같은 이름의 속성을 정의할 수도 있습니다. 예를 들어 car.speed = 80은 해당 car 인스턴스에 속성을 설정하지만, Tesla.speed는 여전히 클래스 속성을 가리킵니다. 공유 값을 명확히 사용하려면 클래스 이름을 붙인 형식을 사용하세요.

global은 클래스 변수를 정의하지 않는 이유

global 문은 코드 블록에서 이름만 사용해 할당할 때 그 이름을 모듈 네임스페이스에 바인딩하도록 Python에 알립니다. 클래스 본문에서 global speed 다음에 speed = 60을 쓰면 모듈 수준의 이름 speed를 만들거나 갱신합니다. Tesla.speed를 할당하는 것은 아닙니다. 클래스 변수를 정의하려면 global 없이 클래스 본문에 speed = 60처럼 할당한 뒤 클래스 밖에서 Tesla.speed로 접근하세요.

클래스 속성이 필요한 메서드에서도 Tesla.speed를 사용할 수 있습니다. 하위 클래스에서도 동작해야 하는 메서드라면 의도한 조회 방식에 따라 type(self).speed 또는 self.speed를 사용하세요. self.speed는 클래스 속성을 가리는 인스턴스 속성을 읽을 수도 있습니다.