Python面向對象編程——多態、多態性、鴨子類型

Python面向對象編程——多態、多態性、鴨子類型

1、多態

多態指的是一類事物有多種形態,好比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('say wangwang')

class Pig(Animal): #動物的形態之三:豬
    def talk(self):
        print('say aoao')

文件有多種形態:文本文件,可執行文件編程

import abc
class File(metaclass=abc.ABCMeta): #同一類事物:文件
    @abc.abstractmethod
    def click(self):
        pass

class Text(File): #文件的形態之一:文本文件
    def click(self):
        print('open file')

class ExeFile(File): #文件的形態之二:可執行文件
    def click(self):
        print('execute file')

2、多態性

一、什麼是多態動態綁定(在繼承的背景下使用時,有時也稱爲多態性)code

多態性是指在不考慮實例類型的狀況下使用實例,多態性分爲靜態多態性和動態多態性對象

靜態多態性:如任何類型均可以用運算符+進行運算繼承

動態多態性:以下接口

peo=People()
dog=Dog()
pig=Pig()

#peo、dog、pig都是動物,只要是動物確定有talk方法
#因而咱們能夠不用考慮它們三者的具體是什麼類型,而直接使用
peo.talk()
dog.talk()
pig.talk()

#更進一步,咱們能夠定義一個統一的接口來使用
def func(obj):
    obj.talk()

二、爲何要用多態性(多態性的好處)字符串

其實你們從上面多態性的例子能夠看出,咱們並無增長什麼新的知識,也就是說python自己就是支持多態性的,這麼作的好處是什麼呢?it

一、增長了程序的靈活性面向對象編程

以不變應萬變,不論對象變幻無窮,使用者都是同一種形式去調用,如func(animal)

二、增長了程序額可擴展性

經過繼承animal類建立了一個新的類,使用者無需更改本身的代碼,仍是用func(animal)去調用

>>> class Cat(Animal): #屬於動物的另一種形態:貓
...     def talk(self):
...         print('say miao')
... 
>>> def func(animal): #對於使用者來講,本身的代碼根本無需改動
...     animal.talk()
... 
>>> cat1=Cat() #實例出一隻貓
>>> func(cat1) #甚至連調用方式也無需改變,就能調用貓的talk功能
say miao

'''
這樣咱們新增了一個形態Cat,由Cat類產生的實例cat1,使用者能夠在徹底不須要修改本身代碼的狀況下。使用和人、狗、豬同樣的方式調用cat1的talk方法,即func(cat1)
'''

3、鴨子類型

逗比時刻:

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)
相關文章
相關標籤/搜索