面向对象三大特性之多态
-
什么是多态
不同对象响应同一种方法的表现出不同的行为,产生不同的结果
用基类创建一套统一的规则,强制子类去遵循(使用抽象类实现),这样便可以 在不用考虑对象具体类型的前提下而直接使用对象下的方法
-
为什么要有多态
-
增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是以同一种形式去调用,如func(animal)
-
提高程序的拓展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用
-
-
怎么用多态
让几个不同的类拥有相同的父类,继承了相同的方法,然后重新定义其方法,这样用相同的方法就能产生不同的结果.
class Animal: def eat(self): print('动物在吃草')class Person(Animal): def eat(self): # 定义人的方法 print('人吃粮食...')class Pig(Animal): def eat(self): # 定义猪的方法 print('猪吃饲料...')class Dog(Animal): def eat(self): #定义狗的方法 print('狗吃骨头...')# 产生对象person = Person()pig = Pig()dog = Dog()# 调用不同对象的同一方法,产生不同结果(多态性的体现)peo.talk()dog.talk()pig.talk()def func(animal): # 可以进一步封装成一个接口,传入什么对象就调用它的方法 animal.eat()func(pig)
-
abc模块
abstract的缩写 ,抽象的意思
-
使用ABC模块的步骤
-
为类中指定元类为metaclass = abc.ABCMeta
-
在相应的方法上加上@abc.abstractmethod
-
import abcclass Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstractmethod def talk(self): passclass People(Animal): #动物的形态之一:人 def talk(self): print('say hello')class Dog(Animal): #动物的形态之二:狗 def talk(self): print('say wangwang')class Pig(Animal): #动物的形态之三:猪 def talk(self): print('say aoao') # 使用ABC装饰器的目的,将基类变为抽象基类,严格要求子类对象必须使用基类中被装饰的的方法,如果子类中没有该方法则报错.
-
-
鸭子类型
-
在现实中一个物体叫声象鸭子,走路也像鸭子,那么人们就把它当做鸭子
-
对应到编程中就是两个独立的类,没有任何关联,但是两者的方法和 属性都一致(长得像),那么两者就可以实现多态(不同对象响应同一种方法的表现出不同的行为,产生不同的结果).这就是鸭子类型.
-
# 类Foo和Bar都拥有两种相同的方法,故两者称之为鸭子类型class Foo: def f1(self): print('from foo.f1') def f2(self): print('from foo.f2')class Bar: def f1(self): print('from bar.f1') def f2(self): print('from bar.f2')obj1 = Foo()obj2 = Bar()# (obj1,obj2)不同对象针对同一方法(f1)产生不同的结果obj1.f1()obj2.f1()# (obj1,obj2)不同对象针对同一方法(f2)产生不同的结果obj1.f2()obj2.f2()