42. class 정리 - 클래스 속성과 인스턴스 속성
1. 클래스 속성과 인스턴스 속성의 차이
앞서 포스팅 Python(파이썬) 기본 - 41. class 정리 에서 다루었던 초기화자(
__init__
)에서 `self.속성'에 할당 했던 변수들은 모두 인스턴스 속성에 해당합니다.클래스 속성은 아래와 같이
self.속성
에 할당하는 것이 아니라 class안에서 바로 할당합니다.
class CustomClass:
classProperty = 'hi' # 이 속성을 클래스 속성이라고 합니다.
def __init__(self):
self.instanceProperty = 'hello' # 이 속성을 인스턴스 속성이라고 합니다.
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'
'C Lang > Python Basic' 카테고리의 다른 글
class 정리 - 정적메소드 @classmethod와 @staticmethod의 정리 (0) | 2019.06.14 |
---|---|
class 정리 - 상속(inheritance) (0) | 2019.06.14 |
class 정리 - 클래스 기본적인 사용 (0) | 2019.06.14 |
심볼 테이블( Symbol Table )과 객체 (0) | 2019.06.11 |
클래스 - 멤버, 생성자/소멸자, 연산자 오버로딩 (0) | 2019.06.11 |