主頁(yè) > 知識(shí)庫(kù) > python面向?qū)ο笾?lèi)的繼承詳解

python面向?qū)ο笾?lèi)的繼承詳解

熱門(mén)標(biāo)簽:檢查注冊(cè)表項(xiàng) 銀行業(yè)務(wù) 呼叫中心市場(chǎng)需求 服務(wù)器配置 智能手機(jī) 美圖手機(jī) 鐵路電話(huà)系統(tǒng) 網(wǎng)站文章發(fā)布

一、概述 

面向?qū)ο缶幊?(OOP) 語(yǔ)言的一個(gè)主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現(xiàn)有類(lèi)的所有功能,并在無(wú)需重新編寫(xiě)原來(lái)的類(lèi)的情況下對(duì)這些功能進(jìn)行擴(kuò)展。

通過(guò)繼承創(chuàng)建的新類(lèi)稱(chēng)為“子類(lèi)”或“派生類(lèi)”,被繼承的類(lèi)稱(chēng)為“基類(lèi)”、“父類(lèi)”或“超類(lèi)”,繼承的過(guò)程,就是從一般到特殊的過(guò)程。在某些 OOP 語(yǔ)言中,一個(gè)子類(lèi)可以繼承多個(gè)基類(lèi)。但是一般情況下,一個(gè)子類(lèi)只能有一個(gè)基類(lèi),要實(shí)現(xiàn)多重繼承,可以通過(guò)多級(jí)繼承來(lái)實(shí)現(xiàn)。

繼承概念的實(shí)現(xiàn)方式主要有2類(lèi):實(shí)現(xiàn)繼承、接口繼承。

實(shí)現(xiàn)繼承是指使用基類(lèi)的屬性和方法而無(wú)需額外編碼的能力。接口繼承是指僅使用屬性和方法的名稱(chēng)、但是子類(lèi)必須提供實(shí)現(xiàn)的能力(子類(lèi)重構(gòu)爹類(lèi)方法)。

在考慮使用繼承時(shí),有一點(diǎn)需要注意,那就是兩個(gè)類(lèi)之間的關(guān)系應(yīng)該是“屬于”關(guān)系。例如,Employee 是一個(gè)人,Manager 也是一個(gè)人,因此這兩個(gè)類(lèi)都可以繼承 Person 類(lèi)。但是 Leg 類(lèi)卻不能繼承 Person 類(lèi),因?yàn)橥炔⒉皇且粋€(gè)人。

OO開(kāi)發(fā)范式大致為:劃分對(duì)象→抽象類(lèi)→將類(lèi)組織成為層次化結(jié)構(gòu)(繼承和合成) →用類(lèi)與實(shí)例進(jìn)行設(shè)計(jì)和實(shí)現(xiàn)幾個(gè)階段。

二、類(lèi)的繼承

2.1 繼承的定義

class Person(object):   # 定義一個(gè)父類(lèi)
 
    def talk(self):    # 父類(lèi)中的方法
        print("person is talking....")  
 
 
class Chinese(Person):    # 定義一個(gè)子類(lèi), 繼承Person類(lèi)
 
    def walk(self):      # 在子類(lèi)中定義其自身的方法
        print('is walking...')
 
c = Chinese()
c.talk()      # 調(diào)用繼承的Person類(lèi)的方法
c.walk()     # 調(diào)用本身的方法
 
# 輸出
 
person is talking....
is walking...

2.2 構(gòu)造函數(shù)的繼承 

  如果我們要給實(shí)例 c 傳參,我們就要使用到構(gòu)造函數(shù),那么構(gòu)造函數(shù)該如何繼承,同時(shí)子類(lèi)中又如何定義自己的屬性?

繼承類(lèi)的構(gòu)造方法:

       1.經(jīng)典類(lèi)的寫(xiě)法: 父類(lèi)名稱(chēng).__init__(self,參數(shù)1,參數(shù)2,...)

       2. 新式類(lèi)的寫(xiě)法:super(子類(lèi),self).__init__(參數(shù)1,參數(shù)2,....)

class Person(object):
 
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.weight = 'weight'
 
    def talk(self):
        print("person is talking....")
 
 
class Chinese(Person):
 
    def __init__(self, name, age, language):  # 先繼承,在重構(gòu)
        Person.__init__(self, name, age)  #繼承父類(lèi)的構(gòu)造方法,也可以寫(xiě)成:super(Chinese,self).__init__(name,age)
        self.language = language    # 定義類(lèi)的本身屬性
 
    def walk(self):
        print('is walking...')
 
 
class American(Person):
    pass
 
c = Chinese('bigberg', 22, 'Chinese')

  如果我們只是簡(jiǎn)單的在子類(lèi)Chinese中定義一個(gè)構(gòu)造函數(shù),其實(shí)就是在重構(gòu)。這樣子類(lèi)就不能繼承父類(lèi)的屬性了。所以我們?cè)诙x子類(lèi)的構(gòu)造函數(shù)時(shí),要先繼承再構(gòu)造,這樣我們也能獲取父類(lèi)的屬性了。

子類(lèi)構(gòu)造函數(shù)基礎(chǔ)父類(lèi)構(gòu)造函數(shù)過(guò)程如下:

實(shí)例化對(duì)象c ----> c 調(diào)用子類(lèi)__init__() ---- > 子類(lèi)__init__()繼承父類(lèi)__init__() ----- > 調(diào)用父類(lèi)__init__()

2.3 子類(lèi)對(duì)父類(lèi)方法的重寫(xiě)

  如果我們對(duì)基類(lèi)/父類(lèi)的方法需要修改,可以在子類(lèi)中重構(gòu)該方法。如下的talk()方法

class Person(object):
 
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.weight = 'weight'
 
    def talk(self):
        print("person is talking....")
 
class Chinese(Person):
 
    def __init__(self, name, age, language): 
        Person.__init__(self, name, age) 
        self.language = language
        print(self.name, self.age, self.weight, self.language)
 
    def talk(self):  # 子類(lèi) 重構(gòu)方法
        print('%s is speaking chinese' % self.name)
 
    def walk(self):
        print('is walking...')
 
c = Chinese('bigberg', 22, 'Chinese')
c.talk()
 
# 輸出
bigberg 22 weight Chinese
bigberg is speaking chinese

三、類(lèi)繼承的事例

class SchoolMember(object):
    '''學(xué)習(xí)成員基類(lèi)'''
    member = 0
 
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.enroll()
 
    def enroll(self):
        '注冊(cè)'
        print('just enrolled a new school member [%s].' % self.name)
        SchoolMember.member += 1
 
    def tell(self):
        print('----%s----' % self.name)
        for k, v in self.__dict__.items():
            print(k, v)
        print('----end-----')
 
    def __del__(self):
        print('開(kāi)除了[%s]' % self.name)
        SchoolMember.member -= 1
 
 
class Teacher(SchoolMember):
    '教師'
    def __init__(self, name, age, sex, salary, course):
        SchoolMember.__init__(self, name, age, sex)
        self.salary = salary
        self.course = course
 
    def teaching(self):
        print('Teacher [%s] is teaching [%s]' % (self.name, self.course))
 
 
class Student(SchoolMember):
    '學(xué)生'
 
    def __init__(self, name, age, sex, course, tuition):
        SchoolMember.__init__(self, name, age, sex)
        self.course = course
        self.tuition = tuition
        self.amount = 0
 
    def pay_tuition(self, amount):
        print('student [%s] has just paied [%s]' % (self.name, amount))
        self.amount += amount
 
t1 = Teacher('Wusir', 28, 'M', 3000, 'python')
t1.tell()
s1 = Student('haitao', 38, 'M', 'python', 30000)
s1.tell()
s2 = Student('lichuang', 12, 'M', 'python', 11000)
print(SchoolMember.member)
del s2
 
print(SchoolMember.member)
 
 
 
# 輸出
----end-----
just enrolled a new school member [haitao].
----haitao----
age 38
sex M
name haitao
amount 0
course python
tuition 30000
----end-----
just enrolled a new school member [lichuang].
3
開(kāi)除了[lichuang]
2
開(kāi)除了[Wusir]
開(kāi)除了[haitao]

到此這篇關(guān)于python面向?qū)ο笾?lèi)的繼承詳解的文章就介紹到這了,更多相關(guān)python類(lèi)的繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python接口,繼承,重載運(yùn)算符詳解
  • Python面向?qū)ο笾^承代碼詳解
  • Python面向?qū)ο缶幊讨^承與多態(tài)詳解
  • Python類(lèi)的繼承和多態(tài)代碼詳解
  • Python 的類(lèi)、繼承和多態(tài)詳解
  • python的繼承詳解

標(biāo)簽:河南 滄州 新疆 樂(lè)山 上海 紅河 長(zhǎng)治 沈陽(yáng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python面向?qū)ο笾?lèi)的繼承詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話(huà)咨詢(xún)

    • 400-1100-266