<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### 7.3.1 繼承 不難理解,子類擁有超類的一切特性,凡是超類適用的地方,子類也適用。例如,“研究 生”具有“學生”的全部屬性,包括數據屬性(如學號、姓名、年齡)和行為屬性(如選課、 參加學生社團等),凡是“學生”能做的,“研究生”都能做。子類擁有超類的全部屬性(數 據和方法),這是面向對象方法中極為重要的一個特色,稱為繼承(inheritance)。 子類除了繼承超類的屬性,還包含一些自己的特殊屬性。例如,“研究生”具有導師信 息,而一般的“學生”未必有導師。在進行面向對象設計時,一般先定義超類,然后在超類 基礎上通過添加一些特殊屬性來定義子類。這種定義方式下,子類中不必重復定義那些繼承 來的屬性,從而簡化了子類定義。這也是繼承機制帶來了的另一個重要特色——代碼重用(code reuse),即超類中的代碼可以通過繼承機制被子類重復使用。當我們需要定義一個新 類時,如果發現它與某個現有的類在很多方面都相同,那么就無需重新寫代碼來實現這些相 同行為,而只需繼承現有功能。 > ① 超類/子類也稱為基類(base class)/派生類(derived class)。 Python 中定義子類采用如下形式: ``` class <子類名>(<超類名>): <特殊屬性 1> ... <特殊屬性 n> ``` 注意,超類與子類的定義一般置于同一個模塊中。如果超類在另一個模塊中定義,則定義子 類時必須指明模塊信息,形如: ``` class <子類名>(<模塊名>.<超類名>): ... ``` 下面通過具體例子來說明超類、子類以及繼承概念。程序 7.3 中定義了一個 Person 類, 它在最一般的層次上刻劃了“人”對象:每個人有姓名和出生年份數據,并且能回答外界提 出的“叫什么名字”、“今年多大了”之類的問題。為便于閱讀、比較,我們將 Person 類的定 義復制于此: ``` class Person: def __init__ (self,n,y): self.name = n self.year = y def whatName(self): print "My name is",self.name def howOld(self,y): age = y – self.year if age > 0: print "My age in",y,"is",age else: print "I was born in",self.year ``` 下面以 Person 作為超類,來定義幾種具有特殊屬性(數據和行為)的人。 首先定義“學生”。學生是人,因此擁有 Person 類的所有信息。學生還具有一些特殊屬性,比如學校、學號信息。按照子類的定義方式,我們可以定義如下的 Student 類: ``` class Student(Person): def __init__ (self,n,y,u,id): Person.__init__ (self,n,y) self.univ = u self.snum = id def getUniv(self): return self.univ def getNum(self): return self.snum ``` Student 類定義的第一行表明,Student 類是 Person 類的子類。作為特殊的人,學生擁有 普通人不一定有的 self.univ(學校)和 self.snum(學號)數據,因此 Student 類的構造器與 Person 不同,需要四個初始參數:姓名、出生年份、學校和學號。創建 Student 對象時要進 行的初始化工作包括:首先作為 Person 對象要執行 Person 對象的初始化,即 Person.__init (); 然后再執行 Student 對象特有的初始化工作,即對 self.univ 和 self.snum 兩個實例變量進行賦 值。可見,子類的構造器一般是在超類構造器的基礎上另外執行一些初始化工作。Student 對象除了能響應 Person 對象都能響應的 whatName 和 howOld 之外,還具有兩個特有的方法: getUniv 和 getNum。 我們再來定義另一種特殊的人——教師。假設教師擁有指導的學生人數信息,以及設置和獲取這個信息的方法,則可定義 Teacher 類如下: ``` class Teacher(Person): def setNum(self,n): self.snum = n def getNum(self): return self.snum ``` Teacher 類沒有定義自己的初始化方法 init__,因此創建 Teacher 對象時將自動調用超類 Person 的 init__方法來進行初始化。Teacher 對象有一個特殊的實例變量 num,但其值不是 在創建對象時初始化的,而是在創建之后利用 setNum 方法來設置。不要忘了,Python 對象 的實例變量可以在任何方法中定義,可以在任何時候賦值。 定義了以上各種類之后,就可以編寫使用這些類的程序了。假設 Person、Student 和 Teacher 類定義都存儲在模塊文件 person.py 之中,下面以交互方式演示對這些類的使用: ``` >>> from person import * >>> tom = Student("Tom",1995,"SJTU","S001") >>> tom.whatName() My name is Tom >>> tom.howOld(2013) My age in 2013 is 18 >>> tom.getUniv() 'SJTU' >>> print tom.getNum() S001 >>> huck = Teacher("Huck",1975) >>> huck.whatName() My name is Huck >>> huck.howOld(2013) My age in 2013 is 38 >>> huck.setNum(8) >>> print huck.getNum() 8 >>> lucy = Person("Lucy",2005) >>> lucy.getUniv() Traceback (most recent call last): File "&lt;pyshell#4&gt;", line 1, in &lt;module&gt; p.getUniv() AttributeError: Person instance has no attribute 'getUniv' ``` 子類繼承超類的所有屬性,因此當創建了 Student 對象 tom 后,就可以向 tom 發消息 whatName 和 howOld,tom 對象能夠正確地響應這兩個消息。當然還可以向 tom 發送 getUniv 和 getNum 消息,這兩個方法是 Student 特有的,tom 自然能做出響應。Teacher 對象 huck 的行為也是類似的。注意,超類的實例并不具有子類中特殊屬性,因此上例中向 Person 對象 lucy發送 getUniv 消息,將導致錯誤。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看