- "多态指的是一类事物有多种形态, 比如: 动物有猫, 狗, 猪"
- import abc
- class Animal(metaclass=abc.ABCMeta): #同一类事物: 动物
- @abc.abstractmethod
- def talk(self):
- pass
- class 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')
- "文件有多种形态: 文本文件, 可执行文件"
- import abc
- class File(metaclass=abc.ABCMeta): #同一类事物: 文件
- @abc.abstractmethod
- def click(self):
- pass
- class Text(File): #文件的形态之一: 文本文件
- def click(self):
- print('open file')
- class ExeFile(File): #文件的形态之二: 可执行文件
- def click(self):
- print('execute file')
2. 多态性
" 多态性好处
1. 增加了程序的灵活性: 以不变应万变, 不论对象怎样变, 使用者都是相同的方式去调用, 如 func(animal)
2. 增加了程序的可扩展性: 通过继承 animal 类创建新的类, 使用者无需修改自己的代码, 还是用 func(animal) 去调用 "
- >>> class Cat(Animal): #属于动物的另外一种形态: 猫
- ... def talk(self):
- ... print('say miao')
- ...
- >>> def func(animal): #对于使用者来说, 自己的代码根本无需改动
- ... animal.talk()
- ...
- >>> cat1=Cat() #实例出一只猫
- >>> func(cat1) #甚至连调用方式也无需改变, 就能调用猫的 talk 功能
- say miao
- '''
- 这样我们新增了一个形态 Cat, 由 Cat 类产生的实例 cat1, 使用者可以在完全不需要修改自己代码的情况下. 使用和人, 狗, 猪一样的方式调用 cat1 的 talk 方法, 即 func(cat1)
- '''
3. 鸭子类型
python 崇尚鸭子类型, 即'如果看起来像, 叫声像而且走起路来像鸭子, 那么它就是鸭子'
python 程序员通常根据这种行为来编写程序
- "例 1: 利用标准库中定义的各种'与文件类似'的对象, 尽管这些对象的工作方式像文件, 但他们没有继承内置文件对象的方法"
- # 二者都像鸭子, 二者看起来都像文件, 因而就可以当文件一样去用
- class TxtFile:
- def read(self):
- pass
- def write(self):
- pass
- class DiskFile:
- def read(self):
- pass
- def write(self):
- pass
- "例 2: 序列类型有多种形态: 字符串, 列表, 元组, 但他们没有直接的继承关系"
- #str,list,tuple 都是序列类型
- s=str('hello')
- l=list([1,2,3])
- t=tuple((4,5,6))
- # 我们可以在不考虑三者类型的前提下使用 s,l,t
- s.__len__()
- l.__len__()
- t.__len__()
- len(s)
- len(l)
- len(t)
来源: http://www.bubuko.com/infodetail-3052911.html