본문 바로가기
Languages/Python

Python multiple inheritance with diamond hierarchy

by 이병준 2014. 12. 11.

super를 사용해 multiple inheritance를 구현하다 보면, 다른 언어와는 다른 특성을 발견하게 됩니다. 예제와 그 실행 결과를 보시죠.



class Mixin(object):

    

    def create(self, str):

        print str + ".t"

        

class MixinA(Mixin):


    def create(self, str):

        super(MixinA, self).create(str+".a")

        #Mixin.create(self, str)


class MixinB(Mixin):


    def create(self, str):

        super(MixinB, self).create(str+".b")

        #Mixin.create(self, str)


class Aggregate(MixinB, MixinA):


    def __init__(self):

        pass



if __name__ == "__main__":


    aggr = Aggregate()

    aggr.create('parameter')

    print Aggregate.__mro__


    


실행 결과는 다음과 같습니다. 


parameter.b.a.t

(<class '__main__.Aggregate'>, <class '__main__.MixinB'>, <class '__main__.MixinA'>, <class '__main__.Mixin'>, <type 'object'>)


즉, super 호출을 resolution하는 순서는 __mro__ 어트리뷰트에 명시된 값 순서를 따릅니다. sibling 클래스에 있는 메서드도 호출된다는 것이 중요합니다. 


물론, Mixin.create(self, str)과 같이 상위 클래스 메서드를 호출하게 되면 이런 순서는 무시되고, 같은 이름의 메서드 가운데 최초 상속된 메서드만 호출됩니다.



댓글0