オブジェクト向けのマルチ継承


マルチ継承
  • Pythonの異なるバージョンのクラス
  •     Python2.2            ,    object ,      .
        Python2     ,     (   )    
        Python3        
                object ,       super.
  • マルチ継承
  •     OCP  :    、   
             :     、    
    
          
              ,  、           ,         ,       
         ,    .              ,       .
    
                      ,         
  • マルチ継承のメリットとデメリット
  •       :
                         
          :
                   ,     ,    
    
          :
                         .               ?      
             ?
    
                            ,                 
        C++     ;Java      
        Java ,           ,             .Java      ,
               ,            ,         
    
                   ,  ,         ,     shout  ,    
             shout   ?
    
            :
                    ,       ,      ,           
  • Pythonマルチ継承
  • を実現
    構文:
    classクラス名(ベースクラスリスト):
    ステートメントブロック   Python MRO(method resolusion order)
    需要:Documentサブクラスに印刷機能を提供する
    考え方:
    1ベースクラスでprintメソッドを提供する
    サブクラスが提供する方法は、必ずしもサブクラスの印刷に適していないため、サブクラスではオーバーライド重量が必要であるため、具体的に実現すべきではない.
    書き込み、printは印刷能力であり、すべてのDocumentサブクラスが必要とするわけではない.
    2印刷機能が必要なサブクラスに追加
    サブクラスに直接追加すると、OCPの原則に違反するので、継承して追加すべきです
    #        
    class Document: 
        def printable(self):
            print('Document')
    
    class Word(Document):
        def printable(self):
            print('word')
    
    class Pdf(Document): pass
    
    Word().printable()
    Pdf().printable()
    #        
    class PrintableWord(Word):
        @classmethod
        def print(cls):        # print = classmethod(print)
            print(id(print))
            print('printword')
    
    class Document: 
        def printable(self):
            print('Document')
    
    class Word(Document): pass
    class Pdf(Document): pass
    
    PrintableWord().print()
    print(PrintableWord.__dict__)
    print(PrintableWord.__mro__)
               ,           ,     ,       ,
         ,      .
        : 
        1.        ,                ,           ,
                
        2.   Mixin,      ,    ,        ,           
             ,       ,        
    #      
    #      ,           
    def printable(cls):
        cls.printable = lambda self: print(self.content)
        return cls
    
    class Document: 
        def __init__(self,content):
            self.content = content
    
    class Word(Document): pass
    class Pdf(Document): pass
    @printable
    class PrintableWord(Word): pass
    
    PrintableWord('word print').printable()
    print(PrintableWord.__dict__)
    print(PrintableWord.__mro__)
    # Mixin  
    # Mixin        
    
    class Document: 
        def __init__(self,content):
            self.content = content
    
    class Word(Document): pass
    class Pdf(Document): pass
    
    class PrintableMixin:
        def print(self):
            print(self.content,' Mixin')
    class PrintableWord(PrintableMixin,Word): pass
    PrintableWord('word print').print()
    print(PrintableWord.__mro__)
    
    #     Mixin,    Mixin     
    class SuperPrintableMixin(PrintableMixin):
        def print(self):
            print('strengthen')
            super().print()
            print('strengthen')
    class PrintableWord(SuperPrintableMixin,Word): pass
    PrintableWord('word print').print()
    print(PrintableWord.__mro__)
  • Mixinクラス
  •     Mixin
        Mixin
        , , , ,
        .
        , 、

        Mixin
            1 Mixin __init__
            2 Mixin ,
            3 Mixin Mixin

        ,Mixin
            class PrintableWord(PrintableWord,word):pass

        Mixin, , Mixin.