Languages/Python2014.12.11 08:59

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)과 같이 상위 클래스 메서드를 호출하게 되면 이런 순서는 무시되고, 같은 이름의 메서드 가운데 최초 상속된 메서드만 호출됩니다.



저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^