多态、多态性、鸭子类型
一.多态
1.1什么是多态
多种状态 形态
生活中具备多种形态的事物 水(水蒸气,冰,液态水) 奥特曼(红色 力量,蓝色 速度) 数码宝贝(究极形态)
一种事物 具备多种形态或状态 就称之为多态
官方解释:不同对象 可以相应同一方法,并作出不同的行为,产生不同结果
1.2如何使用多态
让几个不同类拥有相同父类,这样一来他们就具备了相同的方法,每个子类要覆盖父类的方法,从而每个类的对象行为都不同
class Animal: def eat(self): print("动物在吃东西...") def sleep(self): print("动物在睡觉...") def drink(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() person.eat() pig.eat() dog.eat()
#假设你学习了C1驾照 意味着 所有C1类的汽车都能开 因为每种C1汽车的驾驶方式相同 # 当使用了多态之后 对象的使用者不需要关系这个对象具体的实现,只需要知道该对象属于哪个基类,就能直接使用它 # 如此扩展性变高了 class Phone: def call(self): print("手机就能打电话..") def send_msg(self): print("手机能发短信..") class WindowsPhone(Phone): def call(self): print("windows拨号打电话..") def send_msg(self): print("windows输入号码发短信..") class IPhone(Phone): def call(self): print("IPHONE拨号打电话..") def send_msg(self): print("IPHONE输入号码发短信..") # 可以定义一个方法接受一个手机为参数 无论是什么类型的手机 都可以被使用 def CALL(phone): phone.call() wp = WindowsPhone() ipx = IPhone() CALL(wp) CALL(ipx) # 系统内置的方法有很多都体现了多态 print(len("abc")) print(len([1,2,3,4,])) print(len({"name":"123","sex":"man"})) print("abc".__len__()) print([1,2,3,4,].__len__()) print({"name":"123","sex":"man"}.__len__()) print(len({1,23,4,5}))
二.多态之abc模块
2.1abc模块的作用
多态是多个类的对象拥有相同的方法,但是我们没有从严格要求说必须提供这些方法,子类完全可以不提供这些方法 # 现在要做的就是 严格要求 子类必须实现父类声明的方法
import abc # abstract class 是抽象类的缩写 抽象的意思是 不清晰 不具体 看不懂 #使用ABC模块来限制子类 的步骤 #1.为类中指定元类为abc.ABCMeta #2.在相应的方法上加上abc.abstractmethod装饰器 class Animal(metaclass=abc.ABCMeta): @abc.abstractmethod def eat(self): pass @abc.abstractmethod def drink(self): pass class Cat(Animal): def eat(self): print("猫爱吃鱼肉...") def drink(self): print("用舌头舔..") class Dog(Animal): def eat(self): print("狗爱吃骨头...") def drink(self): print("用舌头舔..") class Pig(Animal): def eat(self): print("猪 爱吃草...") def drink(self): print("用嘴吸的..") p = Pig() # p.eat() c = Cat() # c.eat() # 多态的好处 完全不需要考虑得到的对象时声明类型 只要知道了其基类中的内容就能使用 def feeding(animal): animal.eat() animal.drink() feeding(c) feeding(p) # 多态中的基类 相当于(协议 标准 规范) 要求子类必须满足这些标准
三.鸭子类型
pass