多态
1)、什么是多态
多态指的是同一种类型的事物,不同的形态
2)、多态的目的
“多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字)
3)、多态的三种表现形式
② 继承抽象类
③ 鸭子类型
1、继承父类
多态的表现 “形式之一” 就是 继承父类
如何实现:
- 先抽象(即总结子类和父类的相同属性及方法),再继承
父类:定制一套统一的规范(比如:方法名统一)
子类:继承父类,遵循父类的统一的规范(比如:子类遵循父类方法名的统一)
<span style="font-family:"><span>#</span><span> 动物类</span> <span>class</span><span> Animal: </span><span>def</span><span> eat(self): </span><span>pass</span> <span>def</span><span> speak(self): </span><span>pass</span> <span>#</span><span> 猪类</span> <span>class</span><span> Pig(Animal): </span><span>def</span><span> eat(self): </span><span>print</span>(<span>"</span><span>bia叽...</span><span>"</span><span>) </span><span>def</span><span> speak(self): </span><span>print</span>(<span>"</span><span>哼哼哼...</span><span>"</span><span>) </span><span>#</span><span> 猫类</span> <span>class</span><span> Cat(Animal): </span><span>def</span><span> eat(self): </span><span>print</span>(<span>"</span><span>咬叽...</span><span>"</span><span>) </span><span>def</span><span> speak(self): </span><span>print</span>(<span>"</span><span>喵喵喵...</span><span>"</span><span>) </span><span>#</span><span> 狗类</span> <span>class</span><span> Dog(Animal): </span><span>def</span><span> eat(self): </span><span>print</span>(<span>"</span><span>舔叽...</span><span>"</span><span>) </span><span>def</span><span> speak(self): </span><span>print</span>(<span>"</span><span>汪汪汪...</span><span>"</span><span>) animal1 </span>=<span> Pig() animal2 </span>=<span> Cat() animal3 </span>=<span> Dog() animal1.speak() animal2.speak() animal3.speak()</span></span>
www#gaodaima.com来源gaodai#ma#com搞*!代#%^码$网搞代码
执行结果:
<span>哼哼哼... 喵喵喵... 汪汪汪...</span>
注意:在python中不会强制限制 子类 必须要遵循 父类 的规范,所以出现了 继承抽象类
2、继承抽象类
1)什么是抽象类
在python内置的abc模块中,有一个抽象类,使用此类,使子类必须遵循父类的编码规范(不遵循,调用即报错)
2)抽象类的作用
让子类必须遵循父类的编码规范
3)如何实现抽象类
父类需要继承abc模块中:metaclass=abc.ABCMeta
在父类的需要遵循编码规范的方法上装饰上abc.abstractmethod
注意:子类必须要按照父类的方法编写规范,缺一不可。(只要父类中有几个抽象方法,子类就要有几个抽象方法)
例:写一个抽象类
<span style="font-family:"><span>import</span><span> abc </span><span>#</span><span> 父类需要继承abc模块中:metaclass=abc.ABCMeta</span> <span>class</span> Animal(<span>metaclass=</span><span><span>abc.ABCMeta</span>): </span><span>#</span><span> 在父类的需要遵循编码规范的方法上装饰上abc.abstractmethod</span> <span> @abc.abstractmethod </span><span>def</span><span> eat(self): </span><span>pass</span> <span>#</span><span> 在父类的需要遵循编码规范的方法上装饰上abc.abstractmethod</span> <span> @abc.abstractmethod </span><span>def</span><span> speak(self): </span><span>pass</span> <span>#</span><span> 猪类</span> <span>class</span><span> Pig(Animal): </span><span>#</span><span> 根据父类编码规范必须要有eat方法(方法名不能变)</span> <span>def</span><span> eat(self): </span><span>print</span>(<span>"</span><span>bia叽...</span><span>"</span><span>) </span><span>#</span><span> 根据父类编码规范必须要有speak方法(方法名不能变)</span> <span>def</span><span> speak(self): </span><span>print</span>(<span>"</span><span>哼哼哼...</span><span>"</span><span>) </span><span>#</span><span> 此方法无要求,可有可无</span> <span>def</span><span> run(self): </span><span>print</span>(<span>"</span><span>pig is running...</span><span>"</span>)</span><br><br><span style="font-family:">pig_obj = Pig()</span>
3、鸭子类型
1)什么是鸭子类型
不同的对象,只要长得像鸭子,动物行为像鸭子,那就是鸭子!
“鸭子类型” 是多态的表现形式之一
PS:多态(继承父类、继承抽象类、鸭子类型)其实就是代码的规范形式,即编码规范
2)如何实现鸭子类型
不同对象,先抽象出相同类型的方法,给他们定制一套统一的规范
所有的类,在定义时都按照统一的规范进行编写
注意:在python中,强烈推荐鸭子类型
<span style="font-family:"><span>#</span><span> 动物类:定义代码规范</span> <span>class</span><span> Animal: </span><span>def</span><span> eat(self): </span><span>pass</span> <span>def</span><span> speak(self): </span><span>pass</span> <span>#</span><span> 猪类:按照动物类的代码规范来编写</span> <span>class</span><span> Pig: </span><span>def</span><span> eat(self): </span><span>print</span>(<span>"</span><span>bia叽...</span><span>"</span><span>) </span><span>def</span><span> speak(self): </span><span>print</span>(<span>"</span><span>哼哼哼...</span><span>"</span><span>) </span><span>#</span><span> 猫类:按照动物类的代码规范来编写</span> <span>class</span><span> Cat: </span><span>def</span><span> eat(self): </span><span>print</span>(<span>"</span><span>咬叽...</span><span>"</span><span>) </span><span>def</span><span> speak(self): </span><span>print</span>(<span>"</span><span>喵喵喵...</span><span>"</span><span>) </span><span>#</span><span> 狗类:按照动物类的代码规范来编写</span> <span>class</span><span> Dog: </span><span>def</span><span> eat(self): </span><span>print</span>(<span>"</span><span>舔叽...</span><span>"</span><span>) </span><span>def</span><span> speak(self): </span><span>print</span>(<span>"</span><span>汪汪汪...</span><span>"</span>)</span>
4、多态总结
多态的三种表现形式:
继承父类:
耦合度高,程序的可扩展性低
继承抽象类:(强烈不推荐使用)
耦合度极高,程序的扩展性极低
鸭子类型:(强烈推荐使用)
耦合度低,程序的可扩展性高