在物件導向程式設計中,有一個名為繼承的功能,它允許一個新類繼承現有類的屬性和方法。透過使用繼承,您不必總是重新發明輪子,這也意味著您的程式碼將更加簡潔,更易於閱讀和除錯。
首先,什麼是類?
將類想象成建立物件的藍圖,以及定義與從類建立的物件相關的屬性(屬性)和行為(方法)。類就像一個模板,您可以在程式碼中使用和重複使用。
繼承需要兩種型別的類:
基類(又名父類):這是將繼承其屬性和方法的類。派生類(又名子類):這是繼承屬性和方法的類。
有五種型別的繼承:
單繼承: 派生類從單個基類繼承。
多繼承: 派生類從多個基類繼承。
多級繼承: 一個類從一個類派生,而該類又從另一個類派生。
層次繼承: 多個類從單個基類派生。
混合繼承: 兩種或多種繼承型別的組合。
使用繼承的好處包括:
程式碼可重用性
可擴充套件性
更好的程式碼組織
類繼承的基本語法如下所示:
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。