생성자 오버로딩 하는법

조회수 12574회

파이썬 클래스에서는 __init__을 여러 개 만들 수 없는 걸로 아는데 그러면 생성자를 오버로딩하려면 어떻게 해야 하나요?

제 소스코드는

  • 아무 인자도 없으면 myvalue = 3으로 설정
  • 인자가 1개 들어오면 myvalue를 해당 인자로 설정

해야 합니다. 소스코드1은 __init__이 2개라서 제대로 실행되지가 않고 소스코드2는 잘 동작하지만 뭔가 편법 같아 보여요.

소스코드1

class myClass1(object):
    def __init__(self):
        self.myvalue = 3;
    def __init__(self, num):
        self.myvalue = num


o = myClass1() #에러
o = myClass1(1)

소스코드2

class myclass2(object):
    def __init__(self, num = 3):
        self.myvalue = num

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    다음과 같이 None을 쓰시면 해결할 수 있습니다.

    class myClass1(object):
        def __init__(self, num=None):
            num = 3 if num is None else num
    
    

    파라미터에 제한을 두고 싶지 않다면

    class myClass1(object):
        def __init__(self, *args, **kwargs):
            #args -- 이름이 없는 인자를 저장하는 tuple
            # #kwargs -- 이름이 있는 인자를 저장하는 dict
            print "aargs:", args
            print "kwargs:", kwargs
            mynum = 3 if kwargs['num'] is None else kwargs['num']
    
    o = myClass1(3, "hello", num = 1, mystring = "mystring")
    

    결과)

    aargs: (3, 'hello')
    kwargs: {'mystring': 'mystring', 'num': 1}
    

    (*args, **kwargs)를 쓸 때에는 이름이 없는 인자를 먼저, 이름이 없는 인자를 나중에 써야 합니다.

    즉,

    o = myClass1(3, "hello", num = 1, mystring = "mystring") : ok o = myClass1("hello", num = 1, mystring = "mystring", 3) : not ok o = myClass1("hello", num = 1, 3, mystring = "mystring") : not ok

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)