多态指的是一类失误的多种形态(抽象类的子类)。比如,动物有多种形态:人,猪,狗
多态性:多态动态绑定(在继承的背景下使用,有时也称为多态性)
多态性是指,在不考虑实例具体的类型直接使用实例。多态性分为静态多态性和动态多态性。
静态多态性:比如任何类型都可以用运算符 '+' 进行运算。字符串可以加,数字可以相加,列表也可以相加
动态多态性:指抽象类子类的方法的调用。如下例:
import abc
class Animal(metaclass=abc.ABCMeta): # 定义Animal成抽象类
@abc.abstractmethod
def run(self):
pass
@abc.abstractmethod
def eat(self):
pass
class People(Animal):
def run(self):
print('people run')
def eat(self):
print('people eat')
class Dog(Animal):
def run(self):
print('dog run')
def eat(self):
print('dog eat')
p1 = People()
d1 = Dog()
def func(animal): # 作为多态的接口,用户使用的时候只要调用这个接口就行
animal.run()
func(p1) # 使用接口
func(d1)
多态性的好处:
- 增加了程序的灵活性:不论对象怎么变化,使用者都是同一种形式去调用。如 func(animal)
- 增加了程序的可扩展性:
鸭子类型 duck typing
鸭子类型(是一种编程思想):类与类之间不用共同继承一个父类,只要把他们做的像就可以了 好处:即使是不同的类,只要相似,就可以用同样的接口去调用。
python 崇尚的是鸭子类型,即如果看起来像,叫声像,走起路来也像鸭子,那么他就是鸭子。 python 程序猿通常根据这种行为来编写程序。 即,写类的时候即使不是继承关系,也用同样的方式去定义他的方法
例如:
class Disk:
def read(self):
print('disk read')
def write(self):
print('disk write')
class Text:
def read(self):
print('text read')
def write(self):
print('text write')
# Disk和Text没有继承关系,但是写法类似。
d1 = Disk()
t1 = Text()
d1.read() # 有相同的方法
t1.read() # 有相同的方法
实际上,python的内置的类也是这么做的。 比如:list,tuple,str
l = list([1,2,3])
t = tuple(('a','b'))
s = str('hello')
l.__len__() # 不同的类都有len()方法
t.__len__()
s.__len__()
# 正常情况下需要自己定义接口才能统一调用类的属性
# def len(obj):
# return obj.__len__()
# 但是实际上python已经做好了这部分,没有上面的接口函数的定义,也可以直接调用。
len(l)
len(t)
len(s)