將特性與Mixin類混合

python中多重繼承的用途之一是經過mixins擴展類功能。mixin是提供其餘類方法的類,但不被視爲基類python

mixin容許其餘類重用它的接口和實現,而沒必要成爲超類。它們實現了一種獨特的行爲,這種行爲能夠聚合到其餘不相關的類中。它們相似於構成,但它們建立了更強的關係小程序

假設您但願將應用程序中某些類型的對象轉換爲對象的字典表示形式。您能夠在但願支持此功能的每一個類中提供.to_dict()方法,可是.to_dict()的實現彷佛很是相似ide

這多是混入的很好的候選人。首先,從構成示例中稍微修改Employee類測試

 :
     (, , , , , ):
        .  
        .  
        .  
        .  
        .  


     (, ):
          ..()
        ()
        ()
        ()
        ..()

     ():
         ..()

變化很小。您只需在角色和工資單屬性的名稱上添加一個下劃線,便可將其更改成內部屬性。您很快就會知道爲何要進行更改spa

如今,您添加AsDictionaryMixin類code

 :
     ():
         {
            : .()
             ,   ..()
              .()
        }

     (, ):
         (, ):
             (, ):
                 .()
            :
                 ()
        :
             

     (, ):
         .()

AsDictionaryMixin類公開了一個.to_dict()方法,該方法將自身的表示形式做爲字典返回。這個方法是做爲一個dict理解來實現的,它說,「若是這個道具不是內部的,那麼爲self.__dict__.items()中的每一項建立一個映射道具到值的字典。」orm

正如您在開始時看到的,建立一個類從object繼承了一些成員,其中一個成員是__dict__,它基本上是一個對象中全部屬性到它們的值的映射對象

   

 ():
     (, , , , , ):
        .  
        .  
        .  
        .  
        .  

     (, ):
          ..()
        ()
        ()
        ()
        ..()

     ():
         ..()

您所要作的就是繼承AsDictionaryMixin以支持該功能。最好在Address類中支持相同的功能,所以Employee.address屬性以相同的方式表示繼承

   

 ():
     (, , , , , ):
        .  
        .  
        .  
        .  
        .  

     ():
          [.]
         .:
            .(.)
        .()
         .()

您將mixin應用於Address類以支持該功能。如今,您能夠編寫一個小程序進行測試接口

  
    

  ():
    (.(, ))

   ().:
    (.())

該程序實現了print_dict(),它使用縮進將字典轉換爲JSON字符串,所以輸出看起來更好

而後,遍歷全部員工,打印.to_dict()提供的字典表示形式。您能夠運行該程序以查看其輸出

$  .

 {
  : ,
  : ,
  : {
    : ,
    : ,
    : ,
    : ,
    : 
  }
}
{
  : ,
  : ,
  : {
    : ,
    : ,
    : ,
    : ,
    : 
  }
}
{
  : ,
  : ,
  : {
    : ,
    : ,
    : ,
    : ,
    : 
  }
}
{
  : ,
  : ,
  : {
    : ,
    : ,
    : ,
    : ,
    : 
  }
}
{
  : ,
  : ,
  : {
    : ,
    : ,
    : ,
    : ,
    : 
  }
}
相關文章
相關標籤/搜索