← 보드클래스와 상속 · 4/12
객체마다 다른 값 vs 모두가 같이 쓰는 값 — instance attribute와 class attribute
attribute에도 두 종류가 있어요. instance attribute는 self.xxx로 만들어 객체마다 따로 갖고, class attribute는 클래스 안에 바로 써서 모든 객체가 같이 가져요.
class Student:
school = "The University of Suwon"
def __init__(self, name, score):
self.name = name
self.score = score
def show_info(self):
print(f"{self.school} / {self.name} / {self.score}")
s1 = Student("Kim", 95)
s2 = Student("Lee", 88)
s1.show_info()
s2.show_info()
s1.score = 100
Student.school = "New University"
s1.show_info()
s2.show_info()
The University of Suwon / Kim / 95
The University of Suwon / Lee / 88
New University / Kim / 100
New University / Lee / 88
| 코드 줄 | 무슨 뜻 |
|---|---|
school = "The University of Suwon" | class attribute. 설계도 자체에 적힌 값이라 모든 객체가 공유해요 |
self.name = name | instance attribute. 객체마다 따로 저장돼요 |
s1.score = 100 | s1의 score만 바뀌어요. 마지막 출력에서 Kim은 100, Lee는 88 |
Student.school = "New University" | 설계도의 값을 바꿨기 때문에 s1, s2 모두에 반영돼요. 마지막 두 줄이 둘 다 New University |
왜 이런 구분이 필요할까요? 객체가 1,000개인데 모두에게 공통인 값 하나를 바꿔야 한다면 하나씩 고치기 힘들어요. class attribute로 두면 한 번에 바뀌어요(교수님 설명). 참고로 s1.school = "X"처럼 객체 하나에 직접 대입하면 그 객체만 따로 갖게 돼요.
시험엔 이렇게 써요 — 이렇게 고르세요
instance attribute는 객체마다 독립적으로 가지고, class attribute는 class에 공통으로 정의되어 모든 instance가 공유한다. 클래스이름.속성 = 값으로 바꾸면 모든 instance에 반영되고, 객체이름.속성 = 값으로 바꾸면 그 객체에만 적용된다.
잠깐 확인 — Student.school을 바꾸면 s2.school도 바뀌나요?
바뀌어요. school은 class attribute라서 모든 객체가 같은 값을 보기 때문이에요.
다음 카드 → 상속 — 부모의 기능을 물려받기 ★★★
자료: 3~4주차 · Week03_Class_for_PyTorch(pdf, ipynb 업데이트본) · 빅데이터03(3주차)·빅데이터04(4주차) 녹취