Python 多型與抽象類

2022-05-06 21:33:06 字數 2990 閱讀 9268

多型也稱「多型性」,指的是同一種型別的事物,不同的形態。

在python中的多型指的是讓多種類若具備類似的資料屬性與方法屬性,都統一好命名規範,這樣可以提高開發者的**統一性,使得呼叫者更方便去理解。

為了在不知道物件具體型別的情況下,統一物件呼叫方法的規範(名字)

父類: 定製一套統一的規範。(比如: 方法名統一)

子類: 遵循父類的統一的規範。(比如: 子類遵循父類方法名的統一)

多型的三種表現形式

繼承抽象類

-耦合度極高,程式的可擴充套件性極低

繼承父類

-耦合度高,程式的可擴充套件性低

鴨子型別

-耦合度低,程式的可擴充套件性高

#動物類

class animal:

#方法:吃

def eat(self):

pass

#方法:叫

def speak(self):

pass

#豬類class pig(animal):

def eat(self):

print('bia唧')

def speak(self):

print('哼哼哼')

#貓類class cat(animal):

def eat(self):

print('咬...')

def speak(self):

print('喵喵喵')

#狗類class dog(animal):

def eat(self):

print('叫...')

def speak(self):

print('汪汪汪')

pig1 = pig()

cat1 = cat()

dog1 = dog()

# 設定乙個介面

def speak(obj):

obj.speak()

speak(pig1) #pig1.speak()

speak(cat1) #cat1.speak()

speak(dog1) #dog1.speak()

1.增加了程式的靈活性

以不變應萬變,不論物件千變萬化,使用者都是同一種形式去呼叫,如func(animal)

2.增加了程式的可擴充套件性

通過繼承animal類建立了乙個新的類,使用者無需更改自己的**,還是用func(animal)去呼叫  

class people(animal): #屬於動物的另外一種形態:人

def speak(self):

print('say hi')

def func(people): #對於使用者來說,自己的**根本無需改動

people.speak()

people1=people() #例項出乙個人

func(people1) #甚至連呼叫方式也無需改變,就能呼叫人的talk功能

'''這樣我們新增了乙個形態people,由people類產生的例項people1,使用者可以在完全不需要修改自己**的情況下,

使用和貓、狗、豬一樣的方式呼叫people1的speak方法,即func(people1)

'''

在python內建的abc模組中,有乙個抽象類,讓子類必須遵循父類的編寫規範。

注意:在python中不推薦使用抽象類。

子類必須按照父類的方法編寫規範,缺一不可。(只要父類中有幾個抽象方法,子類就必須要定義幾個,可以多,但不能少)

import abc

#動物類

class animal(metaclass = abc.abcmeta):

#方法:吃

@abc.abstractmethod

def eat(self):

pass

#方法:叫

@abc.abstractmethod

def speak(self):

pass

#豬類class pig(animal):

def eat(self):

print('bia唧')

def speak(self):

print('哼哼哼')

pig1 = pig()

pig1.eat()

python崇尚鴨子型別,不同的物件,只要長得像鴨子,動作行為像鴨子,那它就是鴨子。

鴨子型別是多型的一種表現形式。

不同物件,先抽象出相同型別的方法,給他們定製一套統一的規範。所有的類,在定義時都按照統一的規範進行編寫。

#二者都像鴨子,二者看起來都像檔案,因而就可以當檔案一樣去用

class txtfile:

def read(self):

pass

def write(self):

pass

class diskfile:

def read(self):

pass

def write(self):

pass

序列型別:list,str,tuple

l = lisst([1,2,3])

s = str('hello')

t = tuple((1,2,'a'))

#我們可以在不考慮三者型別的前提下使用s,l,t

l.__len__()

s.__len__()

t.__len__()

str1 = 'bh'

list1 = [1,2,3]

# print(str1.__len__())

# print(list1.__len__())

# 自定義統計長度函式

def len(obj):

return obj.__len__()

print(len(str1))

print(len(list1))

多型 抽象類

多型 當中體現多型性,就是父類指向子類 左父右子 格式 父類名稱 物件名 new 子類名稱 介面名稱 物件名 new 實現類名稱 使用多型,物件向上轉型,是絕對安全的,但物件一旦向上轉型父類,就不能呼叫子類原本特有的類容 物件向下轉型,就是還原的動作 格式 子類名稱 物件名 子類名稱 父類物件 含義...

抽象類 多型與介面

abstract 修飾的類為抽象類 方法為抽象方法。含有抽象方法,必被宣告為抽象類。抽象類不能例項化。不能修飾私有方法 構造器 靜態方法 final方法。final 修飾的類不能被繼承 修飾的方法不能被子類重寫 標記的變數名稱大寫且只能被賦值一次。介面介面中所有方法均為公共抽象方法。pulic ab...

多型 抽象方法 抽象類

類的多型主要指方法重寫 abstract關鍵字修飾的類 方法 就是抽象類 方法 方法重寫的要求 子類中重寫的方法要與父類中的方法同名 子類中重寫的方法形參個數要與父類中同名方法的形參個數一致 子類中重寫的方法型別要與父類中同名方法的型別一致 靜態 成員方法 子類中重寫的方法的訪問許可權不能低於父類中...