国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python基礎教程:類的繼承

XFLY / 2794人閱讀

摘要:類的繼承,說明了不同類直接的關系,派生類復用了基類的代碼同時也繼承了基類的屬性和方法。派生類的實例化會創(chuàng)建該類的一個新實例。派生類既可以多帶帶繼承一個基類,也可以多重繼承多個基類。

面向對象語言的一個特性就是類的繼承。繼承的關系跟人類繁衍的關系相似,被繼承的類稱為基類(也叫做父類),繼承而得的類叫派生類(也叫子類),這種關系就像人類的父子關系。

類的繼承,說明了不同類直接的關系,派生類復用了基類的代碼同時也繼承了基類的屬性和方法。派生類定義的語法如下:

派生類的定義
class DerivedClassName(BaseClassName):
    語句1
    ...
    語句n

下面我們根據(jù)這個語法來寫一個繼承的例子:

class Person:
    def __init__(self, name, age, height):
        self.name = name
        self.age = age
        self.height = height

    def look(self):
        print(self.name, "is looking")

    def walk(self):
        print(self.name, "is walking")

class Teacher(Person):
    def __init__(self, name, age, height):
        super().__init__(name, age, height)

    def teach(self):
        print(self.name, "is teaching")

class Student(Person):
    def __init__(self, name, age, height):
        super().__init__(name, age, height)

    def learn(self):
        print(self.name, "is learning")

if __name__ == "__main__":
    teacher = Teacher("Tom", 31, 178)
    s1 = Student("Jim", 12, 160)
    s2 = Student("Kim", 13, 162)

    teacher.look()
    teacher.walk()
    teacher.teach()
    print("==="*5)

    s1.look()
    s1.walk()
    s1.learn()
    print("==="*5)

    s2.look()
    s2.walk()
    s2.learn()

我們定義了一個基類Person,這個人有名字(name)、年齡(age)和身高(height)三個屬性,還有look(), walk()兩個方法。由它派生出兩個類:TeacherStudent,這兩個派生類繼承了name, age, height屬性,也繼承了look(), walk()方法。但它們又有自己獨有的方法,Teacher可以teach()Student可以learn()

運行這個示例代碼,可以得到下面的信息:

Tom is looking
Tom is walking
Tom is teaching
===============
Jim is looking
Jim is walking
Jim is learning
===============
Kim is looking
Kim is walking
Kim is learning

派生類定義的執(zhí)行過程與基類相同。 當構造類對象時,基類會被記住。 此信息將被用來解析屬性引用:如果請求的屬性在類中找不到,搜索將轉往基類中進行查找。 如果基類本身也派生自其他某個類,則此規(guī)則將被遞歸地應用。

派生類的實例化會創(chuàng)建該類的一個新實例。方法引用將按以下方式解析:搜索相應的類屬性,如果搜索的方法在派生類中找不到,就去基類中進行查找,如果基類本身也派生自其它類,則此規(guī)則將被遞歸地應用。如果搜索到了一個函數(shù)對象則方法引用就生效。

比如,Teacher中并沒有定義look(),當我們調用方法teacher.look()的時候會在它的基類Person中找到并調用look()

重載基類方法

派生類可以重載基類的方法。重載,就是重新定義。如果派生類中重新定義了基類的某方法,那么派生類的重載的這個方法就會覆蓋基類中的同名方法。

例如,我們定義Student時可以重載walk()方法,讓它擁有Student特征:

class Student(Person):
    def __init__(self, name, age, height):
        super().__init__(name, age, height)

    def learn(self):
        print(self.name, "is learning")

    def walk(self):
        print("Student:", self.name, "is walking")

再次運行s1.walk()時,就會打印下面的信息:

Student: Jim is walking

Python有兩個內置函數(shù)可被用于檢查繼承機制:

isinstance()來檢查一個實例的類型:isinstance(obj, int)僅僅會在obj.__class__int或某個派生自int的類時為True。

issubclass()來檢查類的繼承關系:issubclass(bool, int)True,因為boolint的子類。但是,issubclass(float, int)False,因為float不是int的子類。

多重繼承

多重繼承的意思就是,一個派生類同時派生自多個基類,繼承它們全部屬性和方法。它的定義形式是:

class DerivedClassName(Base1, Base2, Base3):
    語句1
    ...
    語句1

對于多數(shù)應用來說,在最簡單的情況下,你可以認為搜索從父類所繼承屬性的操作是深度優(yōu)先、從左至右的,當層次結構中存在重疊時不會在同一個類中搜索兩次。 因此,如果某一屬性在 DerivedClassName 中未找到,則會到 Base1 中搜索它,然后(遞歸地)到 Base1 的基類中搜索,如果在那里未找到,再到 Base2 中搜索,依此類推。

真實情況比這個更復雜一些;方法解析順序會動態(tài)改變以支持對 super() 的協(xié)同調用。 這種方式在某些其他多重繼承型語言中被稱為后續(xù)方法調用,它比單繼承型語言中的 super 調用更強大。

比如,我們要定義一個“助教”類,助教是幫助老師教學的高年級同學。他兼具老師和學生的特點,我們可以讓這個類多重繼承“老師類”和“學生類”。

私有變量

我們上一節(jié)講過,Python中沒有類似C++中的“私有變量”。但是,大多數(shù)Python代碼都遵循這樣一個約定(只是約定但很重要):帶有一個下劃線的名稱(例如:_name)應當被動作是API的非僅供部分(無論它是函數(shù)、方法或是數(shù)據(jù)成員)。 這應當被視為一個實現(xiàn)細節(jié),可能不經(jīng)通知即加以改變。

由于存在對于類私有成員的有效使用場景(例如避免名稱與子類所定義的名稱相沖突),因此存在對此種機制的有限支持,稱為名稱改寫。 任何形式為__name的標識符(至少帶有兩個前綴下劃線,至多一個后綴下劃線)的文本將被替換為_classname__name,其中classname為去除了前綴下劃線的當前類名稱。這種改寫不考慮標識符的句法位置,只要它出現(xiàn)在類定義內部就會進行。

名稱改寫有助于讓子類重載方法而不破壞類內方法調用。例如:

class MyList:
    def __init__(self, iterable):
        self.items_list = []
        self.__update(iterable)

    def update(self, iterable):
        for item in iterable:
            self.items_list.append(item)

    __update = update   # 把update()拷貝給私有方法

class MyListSubclass(MyList):

    def update(self, keys, values):
        # 重載 update()
        # 但不會破壞 __init__()
        for item in zip(keys, values):
            self.items_list.append(item)

這個示例中即使正在MyListSubclass引入一個__update標識符的情況下也不會出錯,因為它會在MyList類中被替換為_MyList__update,而在MyListSubclass類中被替換為_MyListSubclass__update

改寫規(guī)則的設計主要是為了避免意外沖突;訪問或修改被視為私有的變量仍然是可能的。這在特殊情況下甚至會很有用,例如在調試器中。

請注意傳遞給 exec() 或 eval() 的代碼不會將發(fā)起調用類的類名視作當前類;這類似于 global 語句的效果,因此這種效果僅限于同時經(jīng)過字節(jié)碼編譯的代碼。 同樣的限制也適用于 getattr(), setattr() 和 delattr(),以及對于?dict?的直接引用。

總結

類的繼承體現(xiàn)了類的關系,基類的屬性和方法可以被派生類繼承,同時派生類又可以重載基類的方法。派生類既可以多帶帶繼承一個基類,也可以多重繼承多個基類。Python的類沒有真正意義上的私有變量,通過約定和名稱改寫來有限支持私有變量。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43843.html

相關文章

  • 【數(shù)據(jù)科學系統(tǒng)學習】Python # 編程基礎[三]

    摘要:新的稱為子類,而被繼承的稱為基類父類或超類。繼承最大的好處是子類獲得了父類的全部功能。在繼承關系中,如果一個實例的數(shù)據(jù)類型是某個子類,那它的數(shù)據(jù)類型也可以被看做是父類。 在上一篇中我們介紹了模塊和數(shù)據(jù)結構,這一篇將介紹面向對象編程。 面向對象編程 面向對象編程——Object Oriented Programming,簡稱 OOP,是一種程序設計思想。OOP 把對象作為程序的基本單元...

    molyzzx 評論0 收藏0
  • Python OOP 面向對象編程

    摘要:時代,如果需要手動繼承,如多態(tài)多態(tài)是指,不同的子類對象調用相同的父類方法,會產(chǎn)生多態(tài)多樣結果的編程特性。 參考:黑馬程序員教程 - Python基礎 面向對象 OOP三大特性,且三個特性是有順序的: 封裝 繼承 多態(tài) 封裝 指的就是把現(xiàn)實世界的事務,封裝、抽象成編程里的對象,包括各種屬性和方法。這個一般都很簡單,不需要多講。 唯一要注意的就是:推薦從小往大開始封裝、開發(fā)類。比如手槍...

    weknow619 評論0 收藏0
  • Python基礎教程

    摘要:函數(shù)內的變量被稱為局部變量,這是與全局變量相反的概念。有一些進行函數(shù)式編程的機制。繼承以通用的類為基礎建立專門的類對象。 6.4.5 參數(shù)收集的逆過程 假設有如下函數(shù): def add(x,y): return x+y 比如說有個包含由兩個相加的數(shù)字組成的元組: params = (1,2) 使用*運算符對參數(shù)進行分配,不過是在調用而不是在定義時使用: >>> add(*params)...

    daydream 評論0 收藏0
  • [零基礎python]類的細節(jié)

    摘要:在對象接口后包裝其實現(xiàn)的細節(jié),從而隔離了代碼的修改對用戶產(chǎn)生的影響。類提供了一個新的本地作用域,最小化了變量名沖突。類其實并沒有結束,不過本講座到此對類暫告一段。 前面對類的有關內容已經(jīng)描述不少了,其實話題遠遠沒有結束,不過對于初學者,掌握這些已經(jīng)算是入門,在以后的實踐中,還需要進行體會和感悟。 這幾天和幾個朋友以各種途徑討論過OOP的相關問題,他們是:令狐蟲、Frank、晉劍、小馮...

    Fundebug 評論0 收藏0
  • [零基礎python]關于類的初步認識

    摘要:反對者在某些領域對此予以否認。下面再引用一段來自維基百科中關于的歷史。類的更嚴格的定義是由某種特定的元數(shù)據(jù)所組成的內聚的包。類還可以有運行時表示形式元對象,它為操作與類相關的元數(shù)據(jù)提供了運行時支持。 在開始部分,請看官非常非常耐心地閱讀下面幾個枯燥的術語解釋,本來這不符合本教程的風格,但是,請看官諒解,因為列位將來一定要閱讀枯燥的東西的。這些枯燥的屬于解釋,均來自維基百科。 1、問題...

    王巖威 評論0 收藏0

發(fā)表評論

0條評論

XFLY

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<