생성자 오버로딩 하는법
조회수 12604회
파이썬 클래스에서는 __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 답변
-
다음과 같이
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")
: oko = myClass1("hello", num = 1, mystring = "mystring", 3)
: not oko = myClass1("hello", num = 1, 3, mystring = "mystring")
: not ok
댓글 입력