多态指的是一类失误的多种形态(抽象类的子类)。比如,动物有多种形态:人,猪,狗 多态性:多态动态绑定(在继承的背景下使用,有时也称为多态性) 多态性是指,在不考虑实
多态指的是一类失误的多种形态(抽象类的子类)。比如,动物有多种形态:人,猪,狗
多态性:多态动态绑定(在继承的背景下使用,有时也称为多态性)
多态性是指,在不考虑实例具体的类型直接使用实例。多态性分为静态多态性和动态多态性。
静态多态性:比如任何类型都可以用运算符 ‘+‘ 进行运算。字符串可以加,数字可以相加,列表也可以相加
动态多态性:指抽象类子类的方法的调用。如下例:
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)