将特性与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()提供的字典表示形式。您能够运行该程序以查看其输出

$  .

 {
  : ,
  : ,
  : {
    : ,
    : ,
    : ,
    : ,
    : 
  }
}
{
  : ,
  : ,
  : {
    : ,
    : ,
    : ,
    : ,
    : 
  }
}
{
  : ,
  : ,
  : {
    : ,
    : ,
    : ,
    : ,
    : 
  }
}
{
  : ,
  : ,
  : {
    : ,
    : ,
    : ,
    : ,
    : 
  }
}
{
  : ,
  : ,
  : {
    : ,
    : ,
    : ,
    : ,
    : 
  }
}
相关文章
相关标签/搜索