본문으로 바로가기
728x90

인스턴스 변수란?

객체가 가지는 속성이며, 클래스를 정의할 때 생성자(__init__) 내부에 정의합니다. 

class Color():
    '''This is Color class.'''
    rgb = {
        'red': (255, 0, 0),
        'green': (0, 255, 0),
        'blue': (0, 0, 255)
    }
    
    def __init__(self, name):
        self.name = name
        
    def get_rgb(self):
        return Color.rgb[self.name]

if __name__ == '__main__':
    red = Color('red')
    green = Color('green')
    blue = Color('blue')

    print(red.__dict__)
    print(green.__dict__)
    print(blue.__dict__)
더보기
{'name': 'red'}
{'name': 'green'}
{'name': 'blue'}

 

생성자 안에 인스턴스 변수를 정의할 때는 변수 앞에 self 를 붙입니다.

생성자의 self 매개변수는 실제 객체가 들어갑니다.

def __init__(self, name):
    self.name = name

 

접근은 다음과 같이.

>>> red = Color('red')
>>> red.name
'red'

 

객체가 가지는 인스턴스 변수들 확인. __dict__

>>> red.__dict__
{'name': 'red'}

 

클래스 변수란?

클래스가 가지는 속성이며, 모든 객체가 공유합니다.

 

다음 Color 클래스는 rgb 라는 클래스 변수를 가집니다.

class Color():
    '''This is Color class.'''
    rgb = {
        'red': (255, 0, 0),
        'green': (0, 255, 0),
        'blue': (0, 0, 255)
    }

 

접근은 다음과 같이.

>>> Color.rgb
{'red': (255, 0, 0), 'green': (0, 255, 0), 'blue': (0, 0, 255)}

 

클래스의 네임스페이스 확인

>>> import pprint
>>> pprint.pprint(Color.__dict__)
mappingproxy({'__dict__': <attribute '__dict__' of 'Color' objects>,
              '__doc__': 'This is Color class.',
              '__init__': <function Color.__init__ at 0x000001D3A1C6F1E0>,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'Color' objects>,
              'get_rgb': <function Color.get_rgb at 0x000001D3A1C6F6A8>,
              'rgb': {'blue': (0, 0, 255),
                      'green': (0, 255, 0),
                      'red': (255, 0, 0)}})

 

다음 예제에서

객체는 인스턴스 함수 get_rgb() 를 호출하고 get_rgb() 함수는 클래스 변수인 rgb에 접근하여 해당 값을 가져옵니다.

class Color():
    '''This is Color class.'''
    rgb = {
        'red': (255, 0, 0),
        'green': (0, 255, 0),
        'blue': (0, 0, 255)
    }
    
    def __init__(self, name):
        self.name = name
        
    def get_rgb(self):
        return Color.rgb[self.name]

if __name__ == '__main__':
    red = Color('red')
    green = Color('green')
    blue = Color('blue')

    print(red.name, red.get_rgb())
    print(green.name, red.get_rgb())
    print(blue.name, red.get_rgb())
더보기
red (255, 0, 0)
green (255, 0, 0)
blue (255, 0, 0)

 

다음 같이 사용할 수도 있습니다.

class Color():
    '''This is Color class.'''
    color_list = []
    def __init__(self, name):
        self.name = name
        Color.color_list.append(name)

if __name__ == '__main__':
    red = Color('red')
    green = Color('green')
    blue = Color('blue')

    print('Color')
    print(f'count : {len(Color.color_list)}')
    print(f'list : {Color.color_list}')
더보기
Color
count : 3
list : ['red', 'green', 'blue']

 

 

정리

  • 인스턴스 변수는 객체가 가지는 속성이다.
  • 클래스 변수는 클래스가 가지는 속성이며, 모든 객체가 공유한다.