클래스 속성(class attribute)
파이썬에서 클래스를 정의할 때 메서드 밖에 존재하는 변수(속성)을 클래스 변수(속성)이라고 합니다.
class Person:
person_cnt = 0 # 클래스 변수
def __init__(self, name, age):
self.name = name # 인스턴스 변수
self.age = age # 인스턴스 변수
Person.person_cnt += 1
print(f"현재까지 {Person.person_cnt}명 생성됨.")
person1 = Person("홍길동", 35)
person2 = Person("변사또", 48)
print(person1.person_cnt)
print(person2.person_cnt)
print(Person.person_cnt)
위 코드에서는 person_cnt가 클래스 속성입니다. 클래스 안에서 클래스 속성에 접근하려면 "클래스명.변수명"으로 접근할 수 있습니다. 클래스 밖에서 클래스 속성에 접근하려면 "클래스명.변수명" 또는 "인스턴스명.변수명"으로 접근할 수 있습니다. 인스턴스마다 독립적인 값을 갖지 않고 같은 값을 공유한다는 것을 알 수 있습니다.
클래스 메서드
클래스 속성은 클래스 메서드와 많은 경우에 함께 사용됩니다. 클래스 내 메서드 중에서 @classmethod 데코레이터가 붙은 메서드들이 클래스 메서드입니다. 클래스 속성을 조작하거나, 팩토리 메서드를 작성할 때 유용하게 사용됩니다. 팩토리 메서드라는 것은 팩토리(공장)이라는 용어와 같이 객체를 생산하는 기능을 수행하는 메서드입니다. 클래스 메서드의 첫 매개변수로는 항상 cls가 전달되어야 합니다.
from datetime import datetime
class Person:
person_cnt = 0 # 클래스 변수
def __init__(self, name, age):
self.name = name # 인스턴스 변수
self.age = age # 인스턴스 변수
Person.add_person_cnt()
@classmethod
def print_person_cnt(cls):
print(f"현재까지 {Person.person_cnt}명 생성됨.")
@classmethod
def add_person_cnt(cls):
cls.person_cnt += 1
@classmethod
def from_year(cls, name, year): # 팩토리 메서드용 classmethod
return cls(name, datetime.now().year - year + 1)
person1 = Person("홍길동", 35)
person2 = Person("변사또", 48)
person3 = Person.from_year("이몽룡", 1984)
보시면 총 3개의 클래스 메서드가 정의되었는데, 그 중 위에 있는 2개는 클래스 속성을 조작하기 위한 용도이고, 마지막 하나는 팩토리 메서드용입니다. 원래는 이름과 나이를 매개변수로 전달해줘야 객체가 생성되는데, from_year() 클래스 메서드 덕분에 나이 대신에 출생연도를 전달해줘도 나이로 변환되어 제대로 객체가 생성됩니다.
관련 글
'Dev > python' 카테고리의 다른 글
[sqlalchemy] from sqlalchemy import nullslast 에러 해결법 (0) | 2023.03.06 |
---|---|
PyQt6와 PySide6의 라이선스 차이 (0) | 2023.02.20 |
[Flask] Flask API 서버에 인증 기능 넣기 (0) | 2023.02.19 |
[flask] ModuleNotFoundError: No module named 'wtforms.fields.html5' 에러 해결 방법 (2) | 2023.01.31 |
[python] 정적 메서드(static method)는 주로 어떤 경우에 사용되는가 (0) | 2023.01.27 |
[python] 비공개 속성, 게터, 세터, @property (0) | 2023.01.26 |
[python] 약수 구하는 알고리즘 (0) | 2023.01.26 |
[python] 클래스 안에 __로 시작하고 __로 끝나는 메소드들, 매직 메소드(magic method) (0) | 2023.01.25 |