우공이산(愚公移山)

자신과 세상을 바꾸는 것은 머리좋고 가진것이 많은 사람이 아니라 결코 포기하지 않는 의지로 꾸준히 노력해 가는 사람이다. 오늘이 쌓여 내일을 만들고, 내일이 쌓여 인생을 만든다.

Code Story

클래스 속성과 인스턴스 속성

보노보노 2022. 1. 26. 17:51

 

1. 클래스 속성과 인스턴스 속성의 차이

  • 앞선 글에서 다루었던 클래서 초기화 함수(__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'