多态与多态性、鸭子类型
一、多态
多态:同一种事物的多种形态。
动物有多种形态:人、猪、狗
# 多态:同一类实数的多种形态
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("way wangwang")
class Pig(Animal): # 动物的形态之三:猪
def talk(self):
print("say aoao")
二、多态性
多态性是指在不考虑实例类型的情况下使用实例。
静态多态性:如任何类型都可以用运算符 + 进行运算
动态多态性:
如下:
多态性:指的是可以在不考虑对象的类型的情况下而直接使用对象
# 多态性:指的是可以在不考虑对象的类型的情况下而直接使用对象
peo1 = People()
dog1 = Dog()
pig1 = Pig()
# 不管是人、是狗还是猪,只要是动物都能talk
peo1.talk()
dog1.talk()
pig1.talk()
# 使用统一接口来使用
def play(animal):
animal.talk()
play(peo1)
play(dog1)
play(pig1)
多态性好处:
1.增加了程序的灵活性
- 以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如 play(animal)
2.增加了程序可扩张性
- 通过继承Animal类创建了一个新的类,使用者无需更改自己的代码,还是用 play(animal) 去调用
三、鸭子类型
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)
共有 0 条评论