Big Ben
Big Ben's Log
Big Ben
전체 방문자
오늘
어제
  • 전체 글 (80)
    • 파이썬 (23)
      • 파이썬 기초 (5)
      • 클래스 (6)
      • 자료구조 (4)
      • Tensorflow (3)
      • PyTorch (2)
      • konlpy (1)
      • anaconda (1)
    • 머신러닝 (3)
      • 선형회귀 (1)
      • Tree 기반 (1)
    • 딥러닝 (6)
      • NLP (2)
      • VISION (2)
      • TABULAR (0)
      • 딥러닝 서버 구축 (2)
    • 그래프 이론 (1)
      • 그래프마이닝 (1)
      • GNN (0)
    • 강화학습 (3)
      • 강화학습 기본 (3)
    • 인공지능 (5)
    • 추천시스템 (2)
      • 추천시스템 기초 (2)
    • Competitions (1)
    • 빅데이터 (8)
      • 하둡 (3)
      • 스파크 (4)
      • 클라우드 (1)
    • SQL (7)
      • MariaDB (2)
    • 논문 리뷰 (2)
    • 대학원 (0)
      • 데이터 사이언스 (0)
      • 경제학 (0)
    • 선형대수학 (7)
      • 선형대수 ICE BREAKING (1)
      • 벡터 (5)
      • 고윳값 (1)
    • 개인프로젝트 (0)
      • 포트폴리오 대시보드 + AI기반 주식 자동매매 (0)
    • 재테크 (1)
    • 자동차 (0)
    • 알고리즘 (11)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • pytorch
  • 선형대수
  • 하둡
  • 자료구조
  • TensorFlow
  • 백준
  • 프로그래밍
  • 코테
  • 알고리즘
  • mysql
  • MariaDB
  • 프로그래머스
  • sql
  • 딥러닝
  • 객체
  • class
  • 선형대수학
  • 머신러닝
  • 파이썬기초
  • 빅데이터
  • 데이터
  • 인공지능
  • 데이터베이스
  • 객체지향
  • PYTHON
  • 코딩테스트
  • 데이터사이언스
  • Baekjoon
  • AI
  • 파이썬

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Big Ben

Big Ben's Log

파이썬/클래스

파이썬과 객체지향 (python and class) 3 - 생성자(__init__, initializer)

2023. 1. 2. 15:58
반응형

파이썬을 하다보면 __init__ 이라는 친구를 종종 만나실 수 있습니다. 많은 경우에서 class안에서 가장 처음으로 정의하는 함수 이기도 하죠. 파이썬에서 이친구는 생성자(initializer)라고 불립니다.

 

이 생성자는 어떨때 쓰일까요?

 

아래 예제를 통해 한번 살펴보겠습니다.

 

# 자동차 class를 만들어보자.
class Car:
    def set_car_spec(self, brand: str, model: str):
        self.brand = brand
        self.model = model
        
    def info(self):
        context = {'brand': self.brand, 'model': self.model}
        print(context)

# ***여기서 self는  class 자체를 지칭한다.         


my_car = Car()   # my_car라는 내 자동차 객체를 만들고
my_car.set_car_spec(brand='hyundai', model='genesis')  # 현대의 제네시스라는 차로 입력을 해주자.
my_car.info()    # 이렇게 정보 호출 메서드를 사용한다면....:
# {'brand': 'hyundai', 'model': 'genesis'}
# 브랜드는 현대, 차종은 제네시스 라는 정보를 dictionary 값으로 리턴을 해준다

# 참고로 파이썬 class안의 속성과 함수는 
# 모두 dot operator('.')를 사용하여 호출할 수 있다.

자동차라는 객체를 이용하여 '나의 차(my_car)'라는 인스턴스를 만들어보았습니다.

여기서 특이한 점은 set_car_spec이라는 메서드를 통해서 인스턴스가 생성된 이후, 즉 사후에 자동차의 브랜드와 모델명을 입력해주었는데요.

여기서 발생하는 문제점이 있습니다.

만약에 set_car_spec을 사용하지 않고, info() 메서드를 호출하면 어떻게 될까요?

 

my_car = Car()
my_car.info()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-86e27dd64ac5> in <module>
     16 
     17 my_car = Car()
---> 18 my_car.info()

<ipython-input-7-86e27dd64ac5> in info(self)
      6 
      7     def info(self):
----> 8         context = {'brand': self.brand,'model': self.model}
      9         print(context)

AttributeError: 'Car' object has no attribute 'brand'

이렇게 AttributeError가 나타나는 것을 볼 수 있습니다. info를 통해 자동차 속성에 접근하려고 보니깐, 속성이 없는것이죠.

 

많은 경우에서 초깃값을 설정해주는 습관을 길러야합니다. 머신러닝, 딥러닝 등등..

말로 명료하게 딱 설명하기는 힘들지만 그래야 코드의 복잡도가 줄어들고 가독성이 올라가기도 하죠.

그래서 인스턴스를 생성할 때, 즉 클래스를 호출할 때 바로 속성을 줄 수 있는 방법이 있습니다. 바로 생성자(__init__)를 활용하는 것이죠.

 

다시 코드를 살펴보겠습니다.

class Car:
    def __init__(self, brand: str, model: str): # 생성자 
        self.brand = brand   
        self.model = model
  
    def change_car_spec(self, brand: str, model: str):
        self.brand = brand
        self.model = model
        
    def info(self):
        context = {'brand': self.brand, 'model': self.model}
        print(context)

my_car = Car(brand='hyundai', model='genesis')   # my_car라는 인스턴스 생성
my_car.info()   
# 출력물:  {'brand': 'hyundai', 'model': 'genesis'}

# 초기에 값을 줘서 차에 대한 정보를 받아 온 것을 볼 수 있음

위처럼 생성자로 속성을 받아주었더니, 에러 없이 info를 활용할 수 있었습니다.

 

클래스가 효율적인 이유를 하나 더 설명해보겠습니다. 만약에 본인이 열심히 돈을 모아서 차를 바꿨다고 가정을 해보겠습니다.
"어? 뭐야 그럼 차종 업데이트 해줘야지!!!" 라고 생각이 드실텐데요. class만의 코드의 유지 보수성이 여기서 빛을 발합니다. 
change_car_spec이라는 메서드를 만든 뒤 활용하면 쉽게 변경된 정보에 대해서도 저장할 수 있습니다.

 

my_car.set_car_spec('Tesla', 'model S')
my_car.info()

# 출력물: {'brand': 'Tesla', 'model': 'model S'}

# 이렇게 업데이트 된 결괏값을 볼 수 있을것이다.

 

 

반응형
저작자표시 (새창열림)

'파이썬 > 클래스' 카테고리의 다른 글

[python] 파이썬 class의 __call__ 함수 (매직메소드)  (0) 2023.03.12
[python] 클래스 메서드(class method)와 정적 메서드(static method)  (0) 2023.03.08
[python] 파이썬 Class 내 self.<variable name>에서 self 키워드는 어떤 역할을 할까?  (0) 2023.03.05
파이썬과 객체지향 (python and class) 2  (0) 2023.01.02
파이썬과 객체지향 (python and class) 1  (0) 2023.01.02
    '파이썬/클래스' 카테고리의 다른 글
    • [python] 클래스 메서드(class method)와 정적 메서드(static method)
    • [python] 파이썬 Class 내 self.<variable name>에서 self 키워드는 어떤 역할을 할까?
    • 파이썬과 객체지향 (python and class) 2
    • 파이썬과 객체지향 (python and class) 1
    Big Ben
    Big Ben
    Data Scientist

    티스토리툴바