Python多態實例

LasonyaHart 8年前發布 | 918 次閱讀 Python

[Python]代碼    

# coding:utf-8
"""
多態(英語:Polymorphism),是指面向對象程序運行時,相同的消息可能會送給多個不同的類之對象,
而系統可依據對象所屬類,引發對應類的方法,而有不同的行為。
簡單來說,所謂多態意指相同的消息給予不同的對象會引發不同的動作稱之。
在面向對象程序設計中,多態一般指子類型多態(Subtype polymorphism)。

上面的定義有點讓初學者費解,黃哥用“打開”這個動作來描述面向對象的多態。
"打開",可以是打開門,打開窗戶,打開書等等。"打開"這個動作,碰到不同的對象門,窗戶,書,有不同的行為模式。
這個就是多態。
本文由黃哥python培訓,黃哥所寫
黃哥python遠程視頻培訓班
https://github.com/pythonpeixun/article/blob/master/index.md

黃哥python培訓試看視頻播放地址
https://github.com/pythonpeixun/article/blob/master/python_shiping.md
"""
# 例1


class Door(object):

    def open(self):
        print "打開門"


class Windows(object):

    def open(self):
        print "打開窗戶"


class Book(object):

    def open(self):
        print "打開書"

lst = [Door(), Windows(), Book()]

for item in lst:
    item.open()

# 例2 一般用繼承來說明多態的例子


class Animal:

    def __init__(self, name):
        self.name = name

    def talk(self):
        raise NotImplementedError("Subclass must implement abstract method")


class Cat(Animal):

    def talk(self):
        return 'Meow!'


class Dog(Animal):

    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Cat('Mr. Mistoffelees'),
           Dog('Lassie')]

for animal in animals:
    print animal.name + ': ' + animal.talk()

# 例3 python 內置有很多多態的應用
# 同樣的 +號 可以用在不同的對象相加,體現(相仿:指相加這個事情)了多態的功能。
print 1 + 2
print "hello" + '黃哥'

# len 函數傳不同的參數,也體現了多態的功能。
print len("黃哥python培訓")
print len([2, 4, 5, 7])

# 工程應用
# 一個簡單的日志記錄函數,用判斷實現的,重構為面向對象多態來實現。
#如果有大量的判斷語句,就可以用多態來實現。


def log_msg(log_type):
    msg = 'Operation successful'
    if log_type == 'file':
        log_file.write(msg)
    elif log_type == 'database':
        cursor.execute('INSERT INTO log_table (MSG) VALUES ('?')', msg)

#重構


class FileLogger(object):

    def log(self, msg):
        log_file.write(msg)


class DbLogger(object):

    def log(self, msg):
        cursor.execute('INSERT INTO log_table (MSG) VALUES ('?')', msg)


def log_msg(obj):
    msg = 'Operation successful'
    obj.log(msg)
 本文由用戶 LasonyaHart 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!