민서네집

[Python] 다중상속 본문

Python

[Python] 다중상속

브라이언7 2015. 1. 4. 17:03

[출처] 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의 함수 호출!



위의 예제 코드에서는 부모 클래스인 ParentOne, ParentTwo 라는 클래스가 정의되어 있으며, 자식 클래스인 Child라는 클래스도 정의되어 있습니다. 

위의 코드에서 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

#include 

class 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

*/


Comments