一, 多态
1.1 什么是多态
多态也称 "多态性", 指的是同一种类型的事物, 不同的形态.
在 python 中的多态指的是让多种类若具备类似的数据属性与方法属性, 都统一好命名规范, 这样可以提高开发者的代码统一性, 使得调用者更方便去理解.
1.2 多态的目的:
为了在不知道对象具体类型的情况下, 统一对象调用方法的规范 (名字)
父类: 定制一套统一的规范.(比如: 方法名统一)
子类: 遵循父类的统一的规范.(比如: 子类遵循父类方法名的统一)
多态的三种表现形式:
继承抽象类
- 耦合度极高, 程序的可扩展性极低
继承父类
- 耦合度高, 程序的可扩展性低
鸭子类型
- 耦合度低, 程序的可扩展性高
- # 动物类
- class Animal:
- #方法: 吃
- def eat(self):
- pass
- #方法: 叫
- def speak(self):
- pass
- # 猪类
- class Pig(Animal):
- def eat(self):
- print('bia 唧')
- def speak(self):
- print('哼哼哼')
- # 猫类
- class Cat(Animal):
- def eat(self):
- print('咬...')
- def speak(self):
- print('喵喵喵')
- # 狗类
- class Dog(Animal):
- def eat(self):
- print('叫...')
- def speak(self):
- print('汪汪汪')
- pig1 = Pig()
- cat1 = Cat()
- dog1 = Dog()
- # 设置一个接口
- def SPEAK(obj):
- obj.speak()
- SPEAK(pig1) #pig1.speak()
- SPEAK(cat1) #cat1.speak()
- SPEAK(dog1) #dog1.speak()
1.3 多态的好处:
1. 增加了程序的灵活性
以不变应万变, 不论对象千变万化, 使用者都是同一种形式去调用, 如 func(animal)
2. 增加了程序的可扩展性
通过继承 animal 类创建了一个新的类, 使用者无需更改自己的代码, 还是用 func(animal) 去调用
- class People(Animal): #属于动物的另外一种形态: 人
- def speak(self):
- print('say hi')
- def func(people): #对于使用者来说, 自己的代码根本无需改动
- people.speak()
- people1=People() #实例出一个人
- func(people1) #甚至连调用方式也无需改变, 就能调用人的 talk 功能
- '''
- 这样我们新增了一个形态 People, 由 People 类产生的实例 people1, 使用者可以在完全不需要修改自己代码的情况下,
- 使用和猫, 狗, 猪一样的方式调用 people1 的 speak 方法, 即 func(people1)
- '''
二, 抽象类
2.1 什么是抽象类?
在 python 内置的 abc 模块中, 有一个抽象类, 让子类必须遵循父类的编写规范.
2.2 如何实现抽象类
父类需要继承 abc 模块中的 metaclass=abc.ABCMeta
在父类的方法中, 需要装饰上 abc.abstractmethod
注意:
在 python 中不推荐使用抽象类.
子类必须按照父类的方法编写规范, 缺一不可.(只要父类中有几个抽象方法, 子类就必须要定义几个, 可以多, 但不能少)
- import abc
- # 动物类
- class Animal(metaclass = abc.ABCMeta):
- #方法: 吃
- @abc.abstractmethod
- def eat(self):
- pass
- #方法: 叫
- @abc.abstractmethod
- def speak(self):
- pass
- # 猪类
- class Pig(Animal):
- def eat(self):
- print('bia 唧')
- def speak(self):
- print('哼哼哼')
- pig1 = Pig()
- pig1.eat()
三, 鸭子类型
3.1 什么是鸭子类型
python 崇尚鸭子类型, 不同的对象, 只要长得像鸭子, 动作行为像鸭子, 那它就是鸭子.
鸭子类型是多态的一种表现形式.
3.2 为什么要有鸭子类型
不同对象, 先抽象出相同类型的方法, 给他们定制一套统一的规范. 所有的类, 在定义时都按照统一的规范进行编写.
- # 二者都像鸭子, 二者看起来都像文件, 因而就可以当文件一样去用
- class TxtFile:
- def read(self):
- pass
- def write(self):
- pass
- class DiskFile:
- def read(self):
- pass
- def write(self):
- pass
序列类型: list,str,tuple
- l = lisst([1,2,3])
- s = str('hello')
- t = tuple((1,2,'a'))
- # 我们可以在不考虑三者类型的前提下使用 s,l,t
- l.__len__()
- s.__len__()
- t.__len__()
- str1 = 'bh'
- list1 = [1,2,3]
- # print(str1.__len__())
- # print(list1.__len__())
- # 自定义统计长度函数
- def LEN(obj):
- return obj.__len__()
- print(LEN(str1))
- print(LEN(list1))
来源: http://www.bubuko.com/infodetail-3363158.html