아래 내용은 공부한 것을 정리하므로 틀린 내용이 포함되어 있을 수 있습니다.
1. 클래스 속성과 인스턴스 속성의 차이
-
앞서 포스팅 Python(파이썬) 기본 - 41. class 정리 에서 다루었던 초기화자(
__init__
)에서 `self.속성’에 할당 했던 변수들은 모두 인스턴스 속성에 해당합니다. - 클래스 속성은 아래와 같이
self.속성
에 할당하는 것이 아니라 class안에서 바로 할당합니다.class CustomClass: 속성명 = 값 def custom_method(): pass ...
2. 클래스 속성
- 클래스 속성에 접근하는 메소드를 작성해보겠습니다.
- 에디터에서 작성합니다.
class Flight: class_attr = [] def add_class_attr(self, number): Flight.class_attr.append(number)
- REPL에서 확인해봅니다.
- 객체를 2개를 만들고, 클래스 속성에 값을 추가하는 인스턴스 메소드를 사용합니다.
- 클래스 속성에서의 직접접근
클래스명.클래스속성
, 객체에서의객체변수명.클래스속성
모두 똑같이 값을 공유합니다.>>> from airtravel import Flight >>> f = Flight() >>> g = Flight() >>> f.add_class_attr(5) >>> Flight.class_attr [5] >>> f.class_attr [5] >>> g.class_attr [5] >>> g.add_class_attr(7) >>> Flight.class_attr [5, 7] >>> g.class_attr [5, 7] >>> f.class_attr [5, 7]
- 똑같은 클래스 속성과 인스턴스 속성을 선언하고 값이 어떻게 변하는지 살펴보겠습니다.
- 초기화자(
__init__
)와 메소드를 하나 추가합니다.class Flight: class_attr = [] def __init__(self): self.class_attr = [] def add_instance_attr(self, number): self.class_attr.append(number) def add_class_attr(self, number): Flight.class_attr.append(number)
- REPL에서 결과값을 확인합니다.
- 인스턴스와 클래스 에 모두 같은 속성이 있으면 아래와 같이 인스턴스 속성을 먼저 찾는 것을 알 수 있습니다.
- 속성과 메소드 이름 찾는 순은 인스턴스, 클래스 순입니다.
>>> from airtravel import Flight >>> f = Flight() >>> g = Flight() >>> f.add_instance_attr(5) >>> Flight.class_attr [] >>> f.class_attr [5] >>> g.class_attr []
- 클래스 속성은 여러 객체가 공유한다는 것을 유의해야합니다.
3. 비공개 클래스 속성
- 비공개 클래스 속성은 인스턴스의 비공개 속성과 동일합니다. 언더바 두개(
__
)로 속성명이 시작하면 비공개 속성이됩니다. - 코드로 확인해봅니다. 아래와 같이
__private_attr = 5
코드를 추가합니다.class Flight: __private_attr = 5 ...생략
- REPL에서 확인해보겠습니다.
>>> from airtravel import Flight >>> Flight.__private_attr Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: type object 'Flight' has no attribute '__private_attr'