切換語言為:簡體

Python 中的繼承機制詳解

  • 爱糖宝
  • 2024-08-14
  • 2055
  • 0
  • 0

在物件導向程式設計中,有一個名為繼承的功能,它允許一個新類繼承現有類的屬性和方法。透過使用繼承,您不必總是重新發明輪子,這也意味著您的程式碼將更加簡潔,更易於閱讀和除錯。

首先,什麼是類?

將類想象成建立物件的藍圖,以及定義與從類建立的物件相關的屬性(屬性)和行為(方法)。類就像一個模板,您可以在程式碼中使用和重複使用。

繼承需要兩種型別的類:

基類(又名父類):這是將繼承其屬性和方法的類。派生類(又名子類):這是繼承屬性和方法的類。

有五種型別的繼承:

  • 單繼承: 派生類從單個基類繼承。

  • 多繼承: 派生類從多個基類繼承。

  • 多級繼承: 一個類從一個類派生,而該類又從另一個類派生。

  • 層次繼承: 多個類從單個基類派生。

  • 混合繼承: 兩種或多種繼承型別的組合。

使用繼承的好處包括:

  • 程式碼可重用性

  • 可擴充套件性

  • 更好的程式碼組織

類繼承的基本語法如下所示:

class baseClass:
      # Base class attributes and methods
 
class derivedClass(baseClass)
      # Derived class attributes and methods

讓我們先建立一個基類。這將使用我在本Python系列中概述的幾個概念。

我們將建立一個定義人名並類似於此的基類:

class Person:
  def __init__(fullName, fname, lname):
    fullName.firstname = fname
    fullName.lastname = lname
 
  def printname(fullName):
    print(fullName.firstname, fullName.lastname)

現在我們已經建立了類,我們使用它來建立物件並像這樣列印物件:

x = Person("Jack", "Wallen")
x.printname()

將所有這些放在一起,它看起來像這樣:

class Person:
    def __init__(fullName, fname, lname):
        fullName.firstname = fname
        fullName.lastname = lname
    def printname(fullName):
        print(fullName.firstname, fullName.lastname)

x = Person("Jack", "Wallen")
x.printname()

執行上面的命令,它將列印“Jack Wallen”。

那是基類。我們建立了一個派生類,它繼承了基類(Person)的屬性和方法。這是簡單部分。我們將建立一個名為 Staff 的新類,它繼承自 Person。該類看起來像這樣:

class Staff(Person):
    pass

透過使用pass,我們通知 Python 我們沒有向新類新增任何新屬性或方法。

然後我們可以像這樣從派生類建立一個新物件:

x = Staff("Olivia", "Nightingale")

使用以下方法列印新物件:

整個程式碼現在看起來像這樣:

class Person:
    def __init__(fullName, fname, lname):
        fullName.firstname = fname
        fullName.lastname = lname
    def printname(fullName):
        print(fullName.firstname, fullName.lastname)

x = Person("Jack", "Wallen")
x.printname()

class Staff(Person):
    pass

x = Staff("Olivia", "Nightingale")
x.printname()

執行上面的程式碼,它將列印:

Jack Wallen
Olivia Nightingale

請記住,我們之前使用pass是因為我們不想向新類新增任何新屬性或方法。現在,我們將向新類新增新屬性和方法。我們將堅持與我們的原始類類似的東西 - 我們的基類。這次,基類是:

class Person(object):
    def __init__(fullName, name):
        fullName.name = name
    def getName(fullName):
        return fullName.name
    def isEmployee(fullName):
        return False

我們在上面新增了兩個新函式,getName(返回人的全名)和isEmployee(假設isEmployee等於 false)。

接下來,我們將建立一個派生類來定義isEmployee等於 True,它看起來像這樣:

class Employee(Person):
    def isEmployee(fullName):
        return True

到目前為止,我們有一個名為 Person 的類和一個名為 Employee 的類。正如您可能假設的那樣,Person 不是員工,而 Employee 是。您將在下面看到它的實際應用:

emp = Person("Jack Wallen")
print(emp.getName(), emp.isEmployee())

emp = Employee("Olivia Nightingale")
print(emp.getName(), emp.isEmployee())

你應該能夠猜到會發生什麼。由於 Jack Wallen 是 Person 類的物件,因此他不會被列為員工,而 Olivia Nightingale 是 Employee 類的物件,因此會被列為員工。 整個程式碼如下:

class Person(object):
    def __init__(self, fullName, name):
        self.name = name
    def getName(self):
        return self.name
    def isEmployee(self):
        return False
class Employee(Person):
    def isEmployee(self):
        return True
emp = Person("Jack Wallen")
print(emp.getName(), emp.isEmployee())
emp = Employee("Olivia Nightingale")
print(emp.getName(), emp.isEmployee())

執行上面的程式碼,輸出將是:

Jack Wallen False
Olivia Nightingale True

很不錯,對吧?

使用 super() 函式

還有super()函式,它強制派生類繼承基類中的所有屬性和方法。這次,我們將重點關注學生及其畢業年份。

super()函式的使用方法如下:

class Student(Person):
    def __init__(self, fullName, fname, lname, year):
        super().__init__(fname, lname)
        self.graduationyear = year

super()函式(在上面的示例中)的解釋是:

  • super():返回超類的臨時物件,允許呼叫其方法

  • __init__():用於初始化新物件的 Python 建構函式方法

  • (fname, lname):傳遞給超類建構函式的引數

我們的整個程式碼如下:

class Person:
    def __init__(self, fullName, fname, lname):
        self.firstname = fname
        self.lastname = lname
    def printname(self):
        print(self.firstname, self.lastname)
class Student(Person):
    def __init__(self, fullName, fname, lname, year):
        super().__init__(fname, lname)
        self.graduationyear = year
    def welcome(self):
        print("Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear)
x = Student("Jack", "Wallen", 2026)
x.welcome()

執行上面的程式碼,輸出將是:

Welcome Jack Wallen to the class of 2026

這就是 Python 繼承的基礎知識。要了解更多關於繼承的資訊,請檢視關於該主題的官方 Python 文件


本教程解釋了 Python 中的繼承,它允許您定義一個類,該類繼承另一個類中的所有方法和屬性。

譯自How To Use Inheritance in Python,作者 Jack Wallen。


0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.