1. 程式人生 > >Python 繼承

Python 繼承

huang 範式 pri 調用 png 重構 del object port

Python 繼承

類的繼承(一)

繼承

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

通過繼承創建的新類稱為“子類”或“派生類”。

被繼承的類稱為“基類”、“父類”或“超類”。

繼承的過程,就是從一般到特殊的過程。

要實現繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現。

在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。

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

? 實現繼承是指使用基類的屬性和方法而無需額外編碼的能力;

? 接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力(子類重構爹類方法);

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

抽象類僅定義將由子類創建的一般屬性和方法。

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

繼承示例(1)

#BlackPerson類 繼承 Person類

#動作:

#BlackPerson可調用Person的talk方法

class Person(object):

def talk(self):

print("person is talking...l")

 

class BlackPerson(Person):

pass

 

b = BlackPerson()

b.talk()

#輸出結果

#person is talking...l

繼承示例(2)

#BlackPerson類 繼承 Person類

#動作:

#BlackPerson繼承 新增方法walk
#BlackPerson繼承 重寫父類talk class Person(object): def talk(self): print("person is talking...1") class BlackPerson(Person): def talk(self): print("person is talking...2") def walk(self): print("is walking....") b = BlackPerson() b.talk() b.walk() #輸出結果 #person is talking...2 #is walking....

繼承式列(3)

------------------------------------------------------------------------------------------------------------------------

#BlackPerson類 WhitePerson 類 繼承 Person類
#動作1:
#Person父類 添加name,age元素
#註:父類添加元素後,對象也許添加元素否則報錯
#
#動作2:
#BlackPerson類新建構造函數,並繼承父類構建函數,先繼承後重組。
#註:子類需要有父類構造函數內的元素,後可新建元素,調用父類
#    成員屬性下,添加構造函數。
#
#原理: #註:如圖1,當子類函數,獲取到name,age元素時,會傳給下面父類的 # 子類元素,父類獲取到子類元素會把傳到的值,劃分給構建函數內的 # 成員屬性,完成先繼承後重組的步驟。
#
#動作3:
#註:在子類繼承父類後,可新建自己類的成員屬性
#
#動作4:
#子類方法下也可使用父類的繼承方法
#註:父類.方法(self) 但這樣做沒有意義。


class Person(object):

    def __init__(self,name,age):
        self.name = name   #self = b self.name = b.name
        self.age = age
        self.sex = "noraml"
    def talk(self):
        print("person is talking...1")

class BlackPerson(Person):

    def __init__(self,name,age ,strength): #先繼承,在重構(動作1)
        Person.__init__(self,name,age)   #父類調用子類元素(動作2)
     self.strength = tering        #繼承父類後可調用自己的成員元素(動作3)


  def talk(self):
     Person.tslk(self)           #調用父類方法(動作4)
print("person is talking...2")       def walk(self): print("is walking....") b = BlackPerson("Kevin","22") class WhitePerson(Person): pass

技術分享

------------------------------------------------------------------------------------------------------------------------

類的繼承(二)

實戰案例

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): #註冊成員,每多出一個對象就+1
        ‘‘‘註冊‘‘‘
        print("just enrolled a new school member [%s]"%self.name)
        SchoolMember.member += 1

    def tell(self):     #問題2.在不改寫子類的情況下,通過基類打印,不同子類的信息。
        """循環打印人員信息"""
        print("-------info:%s---------"%self.name)
        for k,v in self.__dict__.items():
            print("\t",k,v)

    def __del__(self):  #問題1,刪除成員後自動減註冊表。
        ‘‘‘析構函數,開除一個人後註冊表-1‘‘‘
        print("開除了[%s]..."%self.name)
        SchoolMember.member -=1     #每有一個對象刪除就減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 teching(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 #fee學費

    def pay_tuition(self,amount):
        print("student [%s] has just paied [%s]"%(self.name,amount))
        self.amount += amount


t1 = Teacher("Wusir","28","F*M","8000","Python")
s1 = Student("HaiTao","38","N/A","PYS15",300000)
s2 = Student("LiChuang",12,"M","PYS15",11000)

print(t1.__dict__)  #打印變量t1的元素信息。


#問題2.在不改寫子類的情況下,通過基類打印,不同子類的信息。
# t1.tell()
# s1.tell()
#執行結果
# -------info:Wusir---------
#      name Wusir
#      age 28
#      sex F*M
#      salary 8000
#      course Python
#
# -------info:HaiTao---------
#      name HaiTao
#      age 38
#      sex N/A
#      course PYS15
#      tuition 300000




#問題1,刪除成員後自動減註冊表。
# import time
# del s2
# print(SchoolMember.member)
# time.sleep(5)
#執行結果:
# 開除了[LiChuang]...
#2
#開除了[Wusir]...
#開除了[HaiTao]...

註:析構函數,程序執行完畢後會自動輸出。

Python 繼承