首页 » 编程 » Python » Python学习 » 面向对象 » 正文

多态与多态性、鸭子类型

一、多态

多态:同一种事物的多种形态。

动物有多种形态:人、猪、狗

# 多态:同一类实数的多种形态
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)

发表评论

*