1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
class TestClassA : Name = '' def __init__(self, Name) : self.Name = Name print Name print self.Name class TestClassB (TestClassA) : def __init__(self, *args, **kwargs) : TestClassA.__init__(self,Name) self.Company = Company print "ARGS", args print "KWARGS", kwargs # Passing through dictionary def TestMethod (self) : print self.Company Name = 'TestName' Company = 'TestCompany' Config = { "a" : 4, "b" : 3, } Tb = TestClassB(Name, Company, Config=Config) Tb.TestMethod() |
우선 기본 예제를 보자
부모 class : TestClassA
자식 class : TestClassB
TestClassA에는 Class variable “Name” 이 있다.
TestClassB를 사용할 것이다.
아래와 같이 arguments를 넘겼다.
1 |
Tb = TestClassB(Name, Company, Config=Config) |
TestClassB에서 TestClassA의 상속과 함께 __init__ 하는 방법은 두 가지가 될 수 있는데, (super를 사용하는 방법도 있으나 생략)
1.
TestClassA.__init__(self,Name)
2.
TestClassA.__init__(self,*args, **kwargs)
1의 경우엔 TestClassA 에서 선언된
1 2 3 4 |
class TestClassA : Name = '' def __init__(self, Name) : self.Name = Name |
Name이라는 class 변수를 전달 받는 것이다.
2의 경우엔 TestClassA로 ClassTestB를 부를 때
(
Tb = TestClassB(Name, Company, Config=Config) )
넘긴 인자들을 고대로 받는 것이다.
이 경우에 TestClassA의 arguments를 받는 부분도 아래와 같이 수정되어야 한다.
1 2 3 4 5 6 |
class TestClassA : Name = '' def __init__(self, *args, **kwargs) : self.Name = Name print Name print self.Name |
전체를 몽땅 넘겨받아서 적절히 알아서 쓰는 방식이다.
혼자서 사용하기 편할 수는 있을 것 같은데.. 장, 단점이 있어보인다.
Arguments – *args 와 **kwargs
예제를 수행하면 알 수 있지만,
args에는 입력된 일반 변수가 넘어오고, kwargs에는 dictionary 형태의 것들이 넘온다.
예제를 보면 이해가 쉽다.
위 예제에서 args 와 kwargs의 결과는 아래와 같다.
1 2 |
ARGS ('TestName', 'TestCompany') KWARGS {'Config': {'a': 4, 'b': 3}} |
이것을 요렇게
Tb = TestClassB(Name, Company, a=4, b=3) 바꿔보면,
결과
1 2 |
ARGS ('TestName', 'TestCompany') KWARGS {'a': 4, 'b': 3} |
요렇게도 Tb = TestClassB(Name, Company, [], "") 바꿔보면?
1 2 |
ARGS ('TestName', 'TestCompany', [], '') KWARGS {} |
이제야 느낌이 온다..