文章目录  
 P128 多态问题的引出 P129 多态细节和使用 1. 多态介绍&特别说明 2. 多态的好处 3. 特别说明: Python多态的特点 4. 使用多态的机制来解决主人喂食物的问题   
 
先看一个问题 
class  Food : 
    name =  None 
    def  __init__ ( self, name) : 
        self. name =  name
class  Fish ( Food) : 
    
    pass 
class  Bone ( Food) : 
    
    pass 
class  Animal : 
    name =  None 
    def  __init__ ( self, name) : 
        self. name =  name
class  Dog ( Animal) : 
    
    pass 
class  Cat ( Animal) : 
    
    pass 
class  Master : 
    name =  None 
    def  __init__ ( self,  name) : 
        self. name =  name
    def  feed__cat ( self, cat : Cat, fish : Fish) : 
        print ( f"主人 { self. name} ,给动物: { cat. name} ,喂的食物是 { fish. name} " ) 
    def  feed__dog ( self, dog : Dog, bone : Bone) : 
        print ( f"主人 { self. name} ,给动物: { dog. name} ,喂的食物是 { bone. name} " ) 
master =  Master( "zoran" ) 
cat =  Cat( "小花猫" ) 
fish =  Fish( "黄花鱼" ) 
dog =  Dog( "大黄狗" ) 
bone =  Bone( "大棒骨" ) 
master. feed__cat( cat, fish) 
master. feed__dog( dog, bone) 
1)问题是:代码的复用性不高,而且不利于代码维护和功能扩展
2)解决方案:引出我们要讲解的多态
 
class  Animal : 
    def  cry ( self) : 
        pass 
class  Dog ( Animal) : 
    
    pass 
class  Cat ( Animal) : 
    
    def  cry ( self) : 
        print ( "小猫喵喵叫..." ) 
class  Dog ( Animal) : 
    
    def  cry ( self) : 
        print ( "小狗汪汪叫..." ) 
class  Pig ( Animal) : 
    
    def  cry ( self) : 
        print ( "小猪噜噜叫..." ) 
def  func ( animal:  Animal) : 
    animal. cry( ) 
cat =  Cat( ) 
dog =  Dog( ) 
pig =  Pig( ) 
func( cat) 
func( dog) 
func( pig) 
 
1)Python中函数/方法的参数是没有类型限制的,所以多态在python中的体现并不是很严谨(比如:和java等强类型语言比)
2)Python并不要求严格的继承体系,关注的不是对象的类型本身,而是它是否具有要调用的方法(行为)
 
class  AA : 
    def  hi ( self) : 
        print ( "AA-hi().." ) 
class  BB : 
    def  hi ( self) : 
        print ( "BB-hi()..." ) 
def  test ( obj) : 
    obj. hi( ) 
aa =  AA( ) 
bb =  BB( ) 
test( aa) 
test( bb) 
 
class  Food : 
    name =  None 
    def  __init__ ( self,  name) : 
        self. name =  name
class  Fish ( Food) : 
    
    pass 
class  Bone ( Food) : 
    
    pass 
class  Grass ( Food) : 
    
    pass 
class  Animal : 
    name =  None 
    def  __init__ ( self,  name) : 
        self. name =  name
class  Dog ( Animal) : 
    pass 
class  Cat ( Animal) : 
    pass 
class  Horse ( Animal) : 
    pass 
class  Master : 
    name =  None 
    def  __init__ ( self,  name) : 
        self. name =  name
    
    def  feed ( self,  animal:  Animal,  food:  Food) : 
        print ( f"主人 { self. name} ,给动物: { animal. name} ,喂的食物是 { food. name} " ) 
master =  Master( "Zoran" ) 
cat =  Cat( "小花猫" ) 
fish =  Fish( "黄花鱼" ) 
dog =  Dog( "大黄狗" ) 
bone =  Bone( "大棒骨" ) 
horse =  Horse( "乌骓马" ) 
grass =  Grass( "新鲜草" ) 
master. feed( cat,  fish) 
master. feed( dog,  bone) 
master. feed( horse,  grass)