多态
首先我们要了解
1、什么是多态
多态指的是同一种事物具有多种形态。
比如 '水',现实生活中我们的水具有 液态,固态 气态,
水在这些形态下也都是水。
2、为什么要用多态
用基类创建一套统一的规则,强制子类去遵循(使用抽象类实现),这样便可以
在不用考虑对象具体类型的前提下而直接使用对象下的方法
3、如何用多态
1 # 需要提前导入 abc模块 2 import abc #abstract class 3 class Animal(metaclass=abc.ABCMeta): 4 @abc.abstractmethod 5 def eat(self): 6 pass 7 8 @abc.abstractmethod 9 def bark(self): 10 pass 11 12 # obj=Animal() # 抽象基类本身不能被实例化 13 14 class Cat(Animal): 15 def eat(self): 16 print('cat eat') 17 18 def bark(self): 19 print('喵喵喵') 20 21 class Dog(Animal): 22 def eat(self): 23 print('dog eat') 24 25 def bark(self): 26 print('汪汪汪') 27 28 29 30 c=Cat() 31 d=Dog() 32 33 c.bark() 34 d.bark()
补充:
鸭子类型
Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’
python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象
也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。
例1:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法
1 #二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用 2 class TxtFile: 3 def read(self): 4 pass 5 6 def write(self): 7 pass 8 9 class DiskFile: 10 def read(self): 11 pass 12 def write(self): 13 pass
列2:
1 class Disk: 2 def read(self): 3 print('disk read') 4 5 def write(self): 6 print('disk write') 7 8 9 class Txt: 10 def read(self): 11 print('txt read') 12 13 def write(self): 14 print('txt write') 15 16 17 class Process: 18 def read(self): 19 print('process read') 20 21 def write(self): 22 print('process write') 23 24 25 obj1=Disk() 26 obj2=Txt() 27 obj3=Process() 28 29 30 obj1.read() 31 obj2.read() 32 obj3.read()
绑定方法与非绑定方法:
一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):
1. 绑定到类的方法:用classmethod装饰器装饰的方法。
为类量身定制
类.boud_method(),自动将类当作第一个参数传入
(其实对象也可调用,但仍将类当作第一个参数传入)
2. 绑定到对象的方法:没有被任何装饰器装饰的方法。
为对象量身定制
对象.boud_method(),自动将对象当作第一个参数传入
(属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)
二:非绑定方法:用staticmethod装饰器装饰的方法
1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已
注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说