python類的繼承


一、概述 

  面向對象編程 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。

  通過繼承創建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”,繼承的過程,就是從一般到特殊的過程。在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。

  繼承概念的實現方式主要有2類:實現繼承、接口繼承。

  1. 實現繼承是指使用基類的屬性和方法而無需額外編碼的能力。
  2. 接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力(子類重構爹類方法)。

  在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關系應該是“屬於”關系。例如,Employee 是一個人,Manager 也是一個人,因此這兩個類都可以繼承 Person 類。但是 Leg 類卻不能繼承 Person 類,因為腿並不是一個人。

  OO開發范式大致為:划分對象→抽象類→將類組織成為層次化結構(繼承和合成) →用類與實例進行設計和實現幾個階段。

 

二、類的繼承

2.1 繼承的定義

class Person(object):   # 定義一個父類

    def talk(self):    # 父類中的方法
        print("person is talking....")   


class Chinese(Person):    # 定義一個子類, 繼承Person類

    def walk(self):      # 在子類中定義其自身的方法
        print('is walking...')

c = Chinese()
c.talk()      # 調用繼承的Person類的方法
c.walk()     # 調用本身的方法

# 輸出

person is talking....
is walking...

 

2.2 構造函數的繼承 

   如果我們要給實例 c 傳參,我們就要使用到構造函數,那么構造函數該如何繼承,同時子類中又如何定義自己的屬性?

繼承類的構造方法:

        1.經典類的寫法: 父類名稱.__init__(self,參數1,參數2,...)

        2. 新式類的寫法:super(子類,self).__init__(參數1,參數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):  # 先繼承,在重構
        Person.__init__(self, name, age)  #繼承父類的構造方法,也可以寫成:super(Chinese,self).__init__(name,age)
        self.language = language    # 定義類的本身屬性

    def walk(self):
        print('is walking...')


class American(Person):
    pass

c = Chinese('bigberg', 22, 'Chinese')

  如果我們只是簡單的在子類Chinese中定義一個構造函數,其實就是在重構。這樣子類就不能繼承父類的屬性了。所以我們在定義子類的構造函數時,要先繼承再構造,這樣我們也能獲取父類的屬性了。

      子類構造函數基礎父類構造函數過程如下:

      實例化對象c ----> c 調用子類__init__()  ---- > 子類__init__()繼承父類__init__()  ----- > 調用父類 __init__()

      

 

2.3 子類對父類方法的重寫

  如果我們對基類/父類的方法需要修改,可以在子類中重構該方法。如下的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):  # 子類 重構方法
        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

  

 三、類繼承的事例

 

class SchoolMember(object):
    '''學習成員基類'''
    member = 0

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.enroll()

    def enroll(self):
        '注冊'
        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('開除了[%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):
    '學生'

    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
開除了[lichuang]
2
開除了[Wusir]
開除了[haitao]

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM