python面向對象進階-06類的多態和多態性

面向對象的多態可分爲多態和多態性

面向對象編程的多態能夠分爲多態和多態性python

概念

官方解釋: 多個不一樣類對象能夠響應同一個方法,產生不一樣的結果編程

首先強調多態不是一種特殊的語法,而是一種狀態,特性(既多個不一樣對象能夠響應同一個方法,產生不一樣的結果 )函數

既多個對象有相同的使用方法,

spa

好處

​ 對於使用者而言,大大的下降了使用難度
​ 就像USB接口系列,適配usb接口的鼠標,鍵盤,就屬於多態

code

多態

多態指的是一類事物有多種形態,(一個抽象類有多個子類,於是多態的概念依賴於繼承)
 1.序列數據類型有多種形態:字符串,列表,元組
 2.動物有多種形態:人,狗,豬
上列子(code)--->動物的多種形態對象

# 動物有多種形態:人類、豬、狗
class Animal:
    def run(self):  # 子類約定俗稱的必須實現這個方法
        raise AttributeError('子類必須實現這個方法')


class People(Animal):
    def run(self):
        print('人正在走')


class Pig(Animal):
    def run(self):
        print('pig is walking')


class Dog(Animal):
    def run(self):
        print('dog is running')


peo1 = People()
pig1 = Pig()
d1 = Dog()

peo1.run()
pig1.run()
d1.run()

人正在走
pig is walking
dog is running繼承

import abc


class Animal(metaclass=abc.ABCMeta):  # 同一類事物:動物
    @abc.abstractmethod  # 上述代碼子類是約定俗稱的實現這個方法,加上@abc.abstractmethod裝飾器後嚴格控制子類必須實現這個方法
    def talk(self):
        raise AttributeError('子類必須實現這個方法')


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')


peo2 = People()
pig2 = Pig()
d2 = Dog()

peo2.talk()
pig2.talk()
d2.talk()

say hello
say aoao
say wangwang
上列子(code)--->文件的多種形態接口

# 文件有多種形態:文件、文本文件、可執行文件
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')

text = Text()
exe_file = ExeFile()

text.click()
exe_file.click()

open file
execute file字符串




多態性

注意:多態與多態性是兩種概念!!!!!!!!!!!!!!!!!!!!!!!!!!
多態性是指具備不一樣功能的函數可使用相同的函數名,這樣就能夠用一個函數名調用不一樣內容的函數。在面向對象方法中通常是這樣表述多態性:向不一樣的對象發送同一條消息,不一樣的對象在接收時會產生不一樣的行爲(即方法)。也就是說,每一個對象能夠用本身的方式去響應共同的消息。所謂消息,就是調用函數,不一樣的行爲就是指不一樣的實現,即執行不一樣的函數。
上代碼---> 動物形態多態性的使用
列子一面向對象編程

# 多態性:一種調用方式,不一樣的執行效果(多態性)
def func(obj):
    obj.run()

func(peo1)
func(pig1)
func(d1)
# 輸出結果
# 人正在走
# pig is walking
# dog is running

列子二

# 多態性依賴於:繼承
# 多態性:定義統一的接口
def func(obj):  # obj這個參數沒有類型限制,能夠傳入不一樣類型的值
    obj.talk()  # 調用的邏輯都同樣,執行的結果卻不同

func(peo2)
func(pig2)
func(d2)
# 輸出結果
# say hello
# say aoao
# say wangwang

列子三->鴨子類型實現多態

"""
要管理 雞 鴨 鵝
如何可以最方便的 管理,就是我說同一句話,他們都能理解
既它們擁有相同的方法

"""
class JI:
    def bark(self):
        print("哥哥哥")

    def spawn(self):
        print("下雞蛋..")

class Duck:
    def bark(self):
        print("嘎嘎嘎")

    def spawn(self):
        print("下鴨蛋")

class E:
    def bark(self):
        print("餓餓餓....")

    def spawn(self):
        print("下鵝蛋..")

j = JI()
y = Duck()
e = E()

def mange(obj):
    obj.spawn()

mange(j)
mange(y)
mange(e)

# python中處處都有多態  
a = 10
b = "10"
c = [10]

print(type(a))
print(type(b))
print(type(c))

上代碼---> 文件形態多態性的使用

def func(obj):
    obj.click()

func(text)
func(exe_file)
# 輸出結果
# open file
# execute file

上代碼---> 序列數據類型多態性的使用

def func(obj):
    print(len(obj))

func('hello')
func([1, 2, 3])
func((1, 2, 3))
# 輸出結果
# 5
# 3
# 3

綜上能夠說,多態性是一個接口(函數func)的多種實現(如obj.run(),obj.talk(),obj.click(),len(obj))




多態性的好處

其實你們從上面多態性的例子能夠看出,咱們並無增長新的知識,也就是說Python自己就是支持多態性的,這麼作的好處是什麼呢?
 1.增長了程序的靈活性:以不變應萬變,不論對象變幻無窮,使用者都是同一種形式去調用,如func(animal)
 2.增長了程序額可擴展性:經過繼承Animal類建立了一個新的類,使用者無需更改本身的代碼,仍是用func(animal)去調用

上代碼---> 程序拓展性的體現列子

class Cat(Animal):  # 屬於動物的另一種形態:貓
    def talk(self):
        print('say miao')


def func(animal):  # 對於使用者來講,本身的代碼根本無需改動
    animal.talk()


cat1 = Cat()  # 實例出一隻貓
func(cat1)  # 甚至連調用方式也無需改變,就能調用貓的talk功能

# 輸出結果
# say miao

我的大白話環節:

多態:同一種事物的多種形態,動物分爲人類,豬類(在定義角度) 多態性:一種調用方式,不一樣的執行效果(多態性)

相關文章
相關標籤/搜索