鍍金池/ 教程/ Python/ 繼承和多態(tài)
基礎(chǔ)
itertools
HTTP 服務(wù)
hashlib
閉包
文件和目錄
單元測(cè)試
使用 @property
標(biāo)準(zhǔn)模塊
陌生的 metaclass
Base64
進(jìn)程、線程和協(xié)程
讀寫(xiě)二進(jìn)制文件
匿名函數(shù)
輸入和輸出
Click
元組
字符編碼
partial 函數(shù)
參考資料
collections
協(xié)程
類和實(shí)例
Python 之旅
定制類和魔法方法
常用數(shù)據(jù)類型
繼承和多態(tài)
ThreadLocal
HTTP 協(xié)議簡(jiǎn)介
Requests 庫(kù)的使用
讀寫(xiě)文本文件
列表
os 模塊
迭代器 (Iterator)
正則表達(dá)式
集合
上下文管理器
異常處理
你不知道的 super
定義函數(shù)
datetime
資源推薦
字典
slots 魔法
hmac
第三方模塊
進(jìn)程
類方法和靜態(tài)方法
函數(shù)參數(shù)
高階函數(shù)
函數(shù)
re 模塊
高級(jí)特性
線程
argparse
生成器
結(jié)束語(yǔ)
字符串
map/reduce/filter
函數(shù)式編程
Celery
裝飾器

繼承和多態(tài)

在面向?qū)ο缶幊讨?,?dāng)我們已經(jīng)創(chuàng)建了一個(gè)類,而又想再創(chuàng)建一個(gè)與之相似的類,比如添加幾個(gè)方法,或者修改原來(lái)的方法,這時(shí)我們不必從頭開(kāi)始,可以從原來(lái)的類派生出一個(gè)新的類,我們把原來(lái)的類稱為父類基類,而派生出的類稱為子類,子類繼承了父類的所有數(shù)據(jù)和方法。

讓我們看一個(gè)簡(jiǎn)單的例子,首先我們定義一個(gè) Animal 類:

class Animal(object):
    def __init__(self, name):
        self.name = name
    def greet(self):
        print 'Hello, I am %s.' % self.name

現(xiàn)在,我們想創(chuàng)建一個(gè) Dog 類,比如:

class Dog(object):
    def __init__(self, name):
        self.name = name
    def greet(self):
        print 'WangWang.., I am %s. ' % self.name

可以看到,Dog 類和 Animal 類幾乎是一樣的,只是 greet 方法不一樣,我們完全沒(méi)必要?jiǎng)?chuàng)建一個(gè)新的類,而是從 Animal 類派生出一個(gè)新的類:

class Dog(Animal):
    def greet(self):
        print 'WangWang.., I am %s. ' % self.name

Dog 類是從 Animal 類繼承而來(lái)的,Dog 類自動(dòng)獲得了 Animal 類的所有數(shù)據(jù)和方法,而且還可以對(duì)父類的方法進(jìn)行修改,我們看看使用:

>>> animal = Animal('animal')  # 創(chuàng)建 animal 實(shí)例
>>> animal.greet()
Hello, I am animal.
>>> 
>>> dog = Dog('dog')        # 創(chuàng)建 dog 實(shí)例
>>> dog.greet()
WangWang.., I am dog. 

我們還可以對(duì) Dog 類添加新的方法:

class Dog(Animal):
    def greet(self):
        print 'WangWang.., I am %s. ' % self.name
    def run(self):
        print 'I am running.I am running'

使用:

>>> dog = Dog('dog')
>>> dog.greet()
WangWang.., I am dog.
>>> dog.run()
I am running

多態(tài)

多態(tài)的概念其實(shí)不難理解,它是指對(duì)不同類型的變量進(jìn)行相同的操作,它會(huì)根據(jù)對(duì)象(或類)類型的不同而表現(xiàn)出不同的行為

事實(shí)上,我們經(jīng)常用到多態(tài)的性質(zhì),比如:

>>> 1 + 2
3
>>> 'a' + 'b'
'ab'

可以看到,我們對(duì)兩個(gè)整數(shù)進(jìn)行 + 操作,會(huì)返回它們的和,對(duì)兩個(gè)字符進(jìn)行相同的 + 操作,會(huì)返回拼接后的字符串。也就是說(shuō),不同類型的對(duì)象對(duì)同一消息會(huì)作出不同的響應(yīng)。

再看看類的例子:

class Animal(object):
    def __init__(self, name):
        self.name = name
    def greet(self):
        print 'Hello, I am %s.' % self.name

class Dog(Animal):
    def greet(self):
        print 'WangWang.., I am %s.' % self.name

class Cat(Animal):
    def greet(self):
        print 'MiaoMiao.., I am %s' % self.name

def hello(animal):
    animal.greet()

看看多態(tài)的使用:

>>> dog = Dog('dog')
>>> hello(dog)
WangWang.., I am dog.
>>>
>>> cat = Cat('cat')
>>> hello(cat)
MiaoMiao.., I am cat

可以看到,catdog 是兩個(gè)不同的對(duì)象,對(duì)它們調(diào)用 greet 方法,它們會(huì)自動(dòng)調(diào)用實(shí)際類型的 greet 方法,作出不同的響應(yīng)。這就是多態(tài)的魅力。

小結(jié)

  • 繼承可以拿到父類的所有數(shù)據(jù)和方法,子類可以重寫(xiě)父類的方法,也可以新增自己特有的方法。
  • 有了繼承,才有了多態(tài),不同類的對(duì)象對(duì)同一消息會(huì)作出不同的相應(yīng)。
上一篇:Requests 庫(kù)的使用下一篇: