supergravity

class attribute와 instance attribute의 차이는 무엇이고 언제 사용해야 할까? 본문

콘텐츠/파이썬 -OOP

class attribute와 instance attribute의 차이는 무엇이고 언제 사용해야 할까?

supergravity 2021. 9. 6. 17:48

표면적인 차이점 : class attributes vs instance attributes

표면적인 차이점을 관찰하기 위해 예를 들어 봅시다.

class TestClass():
    class_att = 0
    def __init__(self, i):
        self.i = i
one = TestClass(1)
two = TestClass(2)

클래스를 먼저 정의를 하고

인스턴스 원, 투를 생성합니다.

생성된 원, 투는 "."을 이용하여 attribute에 접근할 수 있습니다.

또한 클래스에서 정의한 class_att에도 접근할 수 있습니다.

 

이 예에서 i는 instance attribute라고 합니다.

클래스 정의 시 정의한 class_att의 경우에는 class attribute라고 합니다.

신기한 점은 class attribute의 경우 클래스에서 바로 접근이 가능합니다.

 

도대체 class attribute와 instance attribute의 차이는 무엇이고 언제 사용해야 할까요?

이를 우선적으로 파이썬 내부에서 어떻게 돌아가는지 알아봅시다.

 

아주 조금 심오한 차이점 : class namespace vs instance namespace

class attibute와 instance attribute의 차이를 명확하게 하기 위해서!

우선적으로 namespace를 알아야 합니다.

그러면 간단하게 namespace에 대해서 알아봅시다.

 

namespace는 이름(변수)에서 object(메모리에 저장된 데이터)로 가는 1대 1 함수입니다.

이름 1개에 object 1개가 대응되어 있습니다.

이는 파이썬의 dictionary와 구조가 비슷합니다.

그래서 대부분의 namespace는 dictionary로 구현되어 있습니다.

 

python의 class namespace와 instance namespace는 독립적으로 존재합니다.

namespace는 python class의 pre_defined_attributs(파이썬에서 클래스를 구현할 때 구현된 기본 attribute들이다)

중 한가 메서드인 __dict__를 이용하여 확인할 수 있습니다.

class_att와 i는 아까 전에 점(.)을 이용하여 값에 접근했었습니다.

(TestClass.__dict__를 살펴보면 'class_att' : 0를 찾을 수 있습니다.)

이 처럼 namespace에 점(.)을 이용하여 object에 접근이 가능합니다.

 __dict__에 출력되는 내용을 보면 python dictionary와 비슷합니다.

그래서 dictionary에 접근하는 방식인 [ ]을 통해서 접근 가능한지 확인해 보면..

접근이 가능합니다.

 

 

이 시점에서 의문이 생기는 점이 있습니다.

아까 전에 one.class_att입니다.

one은 Instance이고 instance namspace를 가지고 있습니다.

그래서 출력해 보면 { 'i' : 1}입니다.

이러한 namespace를 가지고 있기에 점(.)을 이용하여 1에 접근이 가능했습니다.

근데? one.class_att의 경우에는 namespace에 없음에도 불구하고 오류 없이 출력이 됩니다.

 

뭔 일이야?

눈치가 빠른 분들은 알겠지만..

python에서 instance에 대해여 점(.)을 이용해 namespace에 접근할 때는

우선적으로 Instance namespace에 접근하고 그다음으로 class namespace에 접근합니다.

그러면 언제 class attribute 사용하는데?

class attribute는 class namespace에 존재합니다.

class namespace는 instance namespace와 달리 단 한 개만 존재합니다.

Instance namespace는 Instance 1개당 1개씩 존재합니다.

그래서 class attribute는 Instance들이 공통으로 가지고 있는 속성을 나타낼떄 사용하면 적절합니다.

 

 

 

 

 

 

https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide

 

 

Python Class Attributes: An Overly Thorough Guide

Python class attributes can lead to elegant code, as well as frustrating bugs. In this guide, we will outline specific use-cases for attributes, properties, variables, objects and more.

www.toptal.com

 

'콘텐츠 > 파이썬 -OOP' 카테고리의 다른 글

파이썬 - OOP 2  (0) 2021.09.07
파이썬 - Object-Oriented Programming (OOP) 기초 - 보완 필요  (0) 2021.09.06
Comments