본문 바로가기
Python/Python FAQ

Python 다중 생성자를 구현하는 깨끗하고 "파이썬스러운" 방법은 무엇인가요?, What is a clean "pythonic" way to implement multiple constructors?

by 베타코드 2023. 6. 7.
반응형

질문


이에 대한 명확한 답변을 찾을 수 없습니다. 제가 알기로는 Python 클래스에서 __init__ 함수를 여러 개 가질 수 없습니다. 그렇다면 이 문제를 어떻게 해결할까요?

number_of_holes 속성을 가진 Cheese 클래스가 있다고 가정해 봅시다. 이러한 방식으로 치즈 객체를 생성하는 두 가지 방법이 필요합니다...

  1. num_holes = 15와 같은 구멍 수를 입력 받는 방법: parmesan = Cheese(num_holes = 15).
  2. 인수를 입력받지 않고 number_of_holes 속성을 무작위로 생성하는 방법: gouda = Cheese().

이를 수행하는 유일한 방법은 다음과 같지만, 이 방법은 복잡해 보입니다:

class Cheese():
    def __init__(self, num_holes = 0):
        if (num_holes == 0):
            # number_of_holes를 무작위로 생성
        else:
            number_of_holes = num_holes

어떻게 생각하시나요? 다른 방법이 있을까요?


답변


사실 None은 "마법" 값에 대해 훨씬 더 좋습니다:

class Cheese():
    def __init__(self, num_holes = None):
        if num_holes is None:
            ...

이제 더 많은 매개변수를 자유롭게 추가하려면:

class Cheese():
    def __init__(self, *args, **kwargs):
        #args -- 익명 인수의 튜플
        #kwargs -- 이름이 지정된 인수의 딕셔너리
        self.num_holes = kwargs.get('num_holes',random_holes())

*args**kwargs 개념을 더 잘 설명하기 위해 (이름을 변경할 수 있음):

def f(*args, **kwargs):
   print 'args: ', args, ' kwargs: ', kwargs

>>> f('a')
args:  ('a',)  kwargs:  {}
>>> f(ar='a')
args:  ()  kwargs:  {'ar': 'a'}
>>> f(1,2,param=3)
args:  (1, 2)  kwargs:  {'param': 3}

http://docs.python.org/reference/expressions.html#calls

반응형

댓글