第七章 面向对象(7):多态与多态性,鸭子类型

多态指的是一类失误的多种形态(抽象类的子类)。比如,动物有多种形态:人,猪,狗

多态性:多态动态绑定(在继承的背景下使用,有时也称为多态性)

多态性是指,在不考虑实例具体的类型直接使用实例。多态性分为静态多态性动态多态性

静态多态性:比如任何类型都可以用运算符 '+' 进行运算。字符串可以加,数字可以相加,列表也可以相加

动态多态性:指抽象类子类的方法的调用。如下例:

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)

猜你喜欢

转载自www.cnblogs.com/py-xiaoqiang/p/11210444.html