Notice
Recent Posts
Recent Comments
Link
- Arawn's Dev Blog
- Outsider's Dev Story
- Toby's Epril
- Benelog
- NHN 개발자 블로그
- SK 플래닛 기술 블로그
- OLC CENTER
- 소프트웨어 경영/공학 블로그
- 모바일 컨버전스
- KOSR - Korea Operating System …
- 넥스트리 블로그
- 리버스코어 ReverseCore
- SLiPP
- 개발자를 위하여... (Nextree 임병인 수석)
- "트위터 부트스트랩: 디자이너도 놀라워할 매끈하고 직관…
- Learning English - The English…
- real-english.com
- 'DataScience/Deep Learning' 카테…
- Deep Learning Summer School, M…
- Deep Learning Courses
민서네집
[Python] 다중상속 본문
[출처] http://blog.eairship.kr/286
Python 의 경우 다중상속이 가능하고,
부모 클래스(Base Class)를 나열하는 순서에 따라 부모 클래스의 변수나 메서드를 찾는다고 한다.
[일부 발췌]
>>> class ParentOne: def func(self): print("ParentOne의 함수 호출!") >>> class ParentTwo: def func(self): print("ParentTwo의 함수 호출!") >>> class Child(ParentOne, ParentTwo): def childFunc(self): ParentOne.func(self) ParentTwo.func(self) >>> objectChild = Child() >>> objectChild.childFunc() ParentOne의 함수 호출! ParentTwo의 함수 호출! >>> objectChild.func() ParentOne의 함수 호출!
위의 코드에서 9행을 한번 보실까요? class Child(ParentOne, ParentTwo): 위 코드에서는 2개 이상의 클래스를 상속 받을때 콤마를 기준으로 상속받을 클래스의 이름을 나열하고 있는 것을 보실 수 있습니다.
(여기서 상속받을 클래스의 나열 순서가 검색 결과에 영향을 끼칩니다.)
그리고 주의깊게 보셔야 할 부분은, 18~19행의 부분인데 한번 보도록 합시다.
objectChild.func() ParentOne의 함수 호출!
위 부분을 보시면 objectChild의 func 함수를 호출하는데, 여기서 ParentOne과 ParentTwo 중 어떤 클래스의 func 함수가 호출되는지 보았더니 ParentOne 클래스의 func 함수가 호출된 모습을 보실 수 있습니다.
이는, 우리가 상속받을 클래스의 이름을 나열할때 순서에 따라 이름을 찾기 때문입니다. 즉, ParentOne 클래스의 이름공간에서 func()를 찾는다는 것입니다.
Python 2.7.6
class ParentBase: a = 3 class ParentOne(ParentBase): def func(self): print("ParentOne Called.. " + str(ParentBase.a)) class ParentTwo(ParentBase): def func(self): print("ParentTwo Called.. " + str(ParentBase.a)) def printA(self): print("A = " + str(ParentBase.a)) class Child(ParentOne, ParentTwo): def childFunc(self): ParentBase.a = 2 ParentOne.a = 4 ParentTwo.a = 5 ParentOne.func(self) ParentTwo.func(self) objectChild = Child() objectChild.childFunc() # [RESULT] # ParentOne Called.. 2 # ParentTwo Called.. 2 objectChild.func() # [RESULT] ParentOne Called.. 2 print(objectChild.a) # [RESULT] 4 objectChild.a = 10 objectChild.printA() # [RESULT] A = 2
[참고] http://soen.kr/lecture/ccpp/cpp3/29-3-2.htm
gcc -o VirtualBase1 VirtualBase1.cpp
./VirtualBase1
#includeclass A { protected: int a; public: A(int aa) { a=aa; } }; class B : public A { protected: int a; int b; int bc; public: B(int aa, int ab) : A(aa) { b=ab; } void printA() {printf("%d, %d\n",A::a, a);} }; class C : public A { protected: int c; int bc; public: C(int aa,int ac) : A(aa) { c=ac; } }; class D : public B, public C { protected: int d; public: D(int aa, int ab, int ac, int ad) : B(aa,ab), C(aa,ac) { d=ad; } void fD() { b = 1; c = 2; // a = 3; // ERROR ! // A::a = 1; // ERROR ! B::a = 2; C::a = 3; C::bc = 3; printf("%d\n", B::a); // 2 printf("%d\n", C::a); // 3 printA(); // 8,2 } }; int main() { D d(8,2,3,4); d.fD(); return 0; } /* D class 에서 a = 3; 을 주석 처리하지 않았을 경우에 에러 메시지는 다음과 같다. error: non-static member 'a' found in multiple base-class subobjects of type 'A': class D -> class B -> class A class D -> class C -> class A 실행 결과는 다음과 같다. ./VirtualBase1 2 3 8, 2 */
'Python' 카테고리의 다른 글
[python] 분산처리, 병렬처리 (0) | 2015.02.13 |
---|---|
[Python] Wingware Python IDE (0) | 2015.01.07 |
[python] __str__(self)의 의미 (0) | 2014.11.17 |
Python 에서 Private 멤버변수나 메서드는 없나? (0) | 2014.11.17 |
Mini-project description - RiceRocks (Asteroids) (0) | 2014.11.17 |
Comments