생성자 오버로딩 하는법


파이썬 클래스에서는 __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
  • 2016년 01월 12일에 작성됨

조회수 669


1 답변


좋아요
0
싫어요
채택취소하기

다음과 같이 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

  • 2016년 01월 12일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close