<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 繼承 面向對象的編程帶來的主要好處之一是代碼的**重用**,實現這種重用的方法之一是通過 繼承 機制。繼承完全可以理解成類之間的 類型和子類型 關系。 假設你想要寫一個程序來記錄學校之中的教師和學生情況。他們有一些共同屬性,比如姓名、年齡和地址。他們也有專有的屬性,比如教師的薪水、課程和假期,學生的成績和學費。 你可以為教師和學生建立兩個獨立的類來處理它們,但是這樣做的話,如果要增加一個新的共有屬性,就意味著要在這兩個獨立的類中都增加這個屬性。這很快就會顯得不實用。 一個比較好的方法是創建一個共同的類稱為`SchoolMember`然后讓教師和學生的類 繼承 這個共同的類。即它們都是這個類型(類)的子類型,然后我們再為這些子類型添加專有的屬性。 使用這種方法有很多優點。如果我們增加/改變了`SchoolMember`中的任何功能,它會自動地反映到子類型之中。例如,你要為教師和學生都增加一個新的身份證域,那么你只需簡單地把它加到`SchoolMember`類中。然而,在一個子類型之中做的改動不會影響到別的子類型。另外一個優點是你可以把教師和學生對象都作為`SchoolMember`對象來使用,這在某些場合特別有用,比如統計學校成員的人數。一個子類型在任何需要父類型的場合可以被替換成父類型,即對象可以被視作是父類的實例,這種現象被稱為**多態現象**。 另外,我們會發現在 重用 父類的代碼的時候,我們無需在不同的類中重復它。而如果我們使用獨立的類的話,我們就不得不這么做了。 在上述的場合中,`SchoolMember`類被稱為 基本類 或 超類 。而`Teacher`和`Student`類被稱為 導出類 或 子類 。 現在,我們將學習一個例子程序。 ``` #!/usr/bin/python # Filename: inherit.py class SchoolMember: ????'''Represents any school member.''' ????def __init__(self, name, age): ????????self.name = name ????????self.age = age ????????print '(Initialized SchoolMember: %s)' % self.name ????def tell(self): ????????'''Tell my details.''' ????????print 'Name:"%s" Age:"%s"' % (self.name, self.age), class Teacher(SchoolMember): ????'''Represents a teacher.''' ????def __init__(self, name, age, salary): ????????SchoolMember.__init__(self, name, age) ????????self.salary = salary ????????print '(Initialized Teacher: %s)' % self.name ????def tell(self): ????????SchoolMember.tell(self) ????????print 'Salary: "%d"' % self.salary class Student(SchoolMember): ????'''Represents a student.''' ????def __init__(self, name, age, marks): ????????SchoolMember.__init__(self, name, age) ????????self.marks = marks ????????print '(Initialized Student: %s)' % self.name ????def tell(self): ????????SchoolMember.tell(self) ????????print 'Marks: "%d"' % self.marks t = Teacher('Mrs. Shrividya', 40, 30000) s = Student('Swaroop', 22, 75) print # prints a blank line members = [t, s] for member in members: ????member.tell() # works for both Teachers and Students ``` (源文件:[code/inherit.py](code/inherit.py)) ## 輸出 ``` $ python inherit.py (Initialized SchoolMember: Mrs. Shrividya) (Initialized Teacher: Mrs. Shrividya) (Initialized SchoolMember: Swaroop) (Initialized Student: Swaroop) Name:"Mrs. Shrividya" Age:"40" Salary: "30000" Name:"Swaroop" Age:"22" Marks: "75" ``` ## 它如何工作 為了使用繼承,我們把基本類的名稱作為一個元組跟在定義類時的類名稱之后。然后,我們注意到基本類的`__init__`方法專門使用`self`變量調用,這樣我們就可以初始化對象的基本類部分。這一點十分重要——Python不會自動調用基本類的constructor,你得親自專門調用它。 我們還觀察到我們在方法調用之前加上類名稱前綴,然后把`self`變量及其他參數傳遞給它。 注意,在我們使用`SchoolMember`類的`tell`方法的時候,我們把`Teacher`和`Student`的實例僅僅作為`SchoolMember`的實例。 另外,在這個例子中,我們調用了子類型的`tell`方法,而不是`SchoolMember`類的`tell`方法。可以這樣來理解,Python總是首先查找對應類型的方法,在這個例子中就是如此。如果它不能在導出類中找到對應的方法,它才開始到基本類中逐個查找。基本類是在類定義的時候,在元組之中指明的。 一個術語的注釋——如果在繼承元組中列了一個以上的類,那么它就被稱作 多重繼承 。
                  <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>

                              哎呀哎呀视频在线观看