파이썬을 하다보면 __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 |