網(wǎng)站404怎么做搜索排名提升
簡(jiǎn)介
在面向?qū)ο缶幊讨?重載(overloading)和重寫(xiě)(overriding)是兩個(gè)不同的概念。
重載(Overloading)的定義
重載是同一個(gè)類中定義多個(gè)同名方法,但是這些方法具有不同的參數(shù)列表(參數(shù)個(gè)數(shù)、參數(shù)類型或參數(shù)順序不同)。
當(dāng)調(diào)用這個(gè)方法時(shí),編譯器會(huì)根據(jù)實(shí)際傳入的參數(shù)自動(dòng)選擇對(duì)應(yīng)的方法實(shí)現(xiàn)。
重寫(xiě)(Overriding)的定義
重寫(xiě)是子類中定義一個(gè)與父類中方法名稱、返回值類型和參數(shù)列表完全相同的方法。
當(dāng)通過(guò)子類的對(duì)象調(diào)用這個(gè)方法時(shí),會(huì)執(zhí)行子類中重寫(xiě)的方法實(shí)現(xiàn),覆蓋父類中的實(shí)現(xiàn)。
區(qū)別
定義位置
重載發(fā)生在同一個(gè)類中,即一個(gè)類里面定義多個(gè)同名方法。
重寫(xiě)發(fā)生在父類和子類之間,即子類重新定義父類中的方法。
參數(shù)列表
重載要求方法參數(shù)列表不同(參數(shù)個(gè)數(shù)、參數(shù)類型或參數(shù)順序不同)。
重寫(xiě)要求方法參數(shù)列表完全相同。
調(diào)用機(jī)制
重載是編譯時(shí)確定調(diào)用哪個(gè)方法,根據(jù)實(shí)際傳入的參數(shù)類型。
重寫(xiě)是運(yùn)行時(shí)確定調(diào)用哪個(gè)方法,取決于通過(guò)哪個(gè)對(duì)象來(lái)調(diào)用方法。
多態(tài)性
重載體現(xiàn)的是編譯時(shí)多態(tài),即同一個(gè)方法名稱根據(jù)參數(shù)而表現(xiàn)不同的行為。
重寫(xiě)體現(xiàn)的是運(yùn)行時(shí)多態(tài),即子類對(duì)象調(diào)用重寫(xiě)后的方法而表現(xiàn)出不同的行為。
重載(Overloading)的應(yīng)用場(chǎng)景
操作符重載
在類中重載常見(jiàn)的操作符,如 +、-、*、/ 等,使得自定義對(duì)象可以使用這些運(yùn)算符。
例如在自定義的 Vector 類中重載 + 和 * 運(yùn)算符,實(shí)現(xiàn)向量的加法和標(biāo)量乘法。
構(gòu)造函數(shù)重載
在類中定義多個(gè)構(gòu)造函數(shù),根據(jù)傳入的參數(shù)不同執(zhí)行不同的初始化操作。
例如 Person 類可以有一個(gè)只需要名字的構(gòu)造函數(shù),也可以有一個(gè)需要名字和年齡的構(gòu)造函數(shù)。
方法重載
在類中定義多個(gè)同名方法,但是參數(shù)列表不同。
例如 print() 函數(shù)在 Python 中就是一個(gè)常見(jiàn)的重載方法,可以接受不同數(shù)量和類型的參數(shù)。
重寫(xiě)(Overriding)的應(yīng)用場(chǎng)景
繼承和多態(tài)
在子類中重寫(xiě)父類的方法,實(shí)現(xiàn)多態(tài)行為。
例如 Animal 類有一個(gè) make_sound() 方法,Dog 和 Cat 子類各自重寫(xiě)這個(gè)方法以體現(xiàn)不同的叫聲。
鉤子方法(Hook Methods)
在父類中定義一些空方法或默認(rèn)實(shí)現(xiàn),讓子類可以根據(jù)需要進(jìn)行重寫(xiě)。
例如在 Django 的 View 類中有許多鉤子方法,如 get()、post()、put() 等,子類可以根據(jù)需要進(jìn)行重寫(xiě)。
框架和庫(kù)的擴(kuò)展
當(dāng)使用第三方框架或庫(kù)時(shí),可以通過(guò)重寫(xiě)某些方法來(lái)擴(kuò)展或定制框架/庫(kù)的功能。
例如在 Flask 中,可以重寫(xiě) create_app() 方法來(lái)自定義應(yīng)用程序的創(chuàng)建過(guò)程。
簡(jiǎn)單實(shí)例
重載(Overloading)的實(shí)例
假設(shè)我們有一個(gè) Vector2D 類,用于表示二維向量。我們可以對(duì)常見(jiàn)的數(shù)學(xué)運(yùn)算符進(jìn)行重載,使得向量之間的運(yùn)算更加直觀:
class Vector2D:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):return Vector2D(self.x + other.x, self.y + other.y)def __sub__(self, other):return Vector2D(self.x - other.x, self.y - other.y)def __mul__(self, scalar):return Vector2D(self.x * scalar, self.y * scalar)# 其他重載方法,如 __str__、__len__ 等
這樣我們就可以像下面這樣使用向量對(duì)象:
v1 = Vector2D(1, 2)
v2 = Vector2D(3, 4)
v3 = v1 + v2
print(v3.x, v3.y) # Output: 4 6
重寫(xiě)(Overriding)的實(shí)例
假設(shè)我們有一個(gè) Animal 基類,定義了一個(gè) make_sound() 方法。我們可以創(chuàng)建 Dog 和 Cat 子類,并重寫(xiě) make_sound() 方法以體現(xiàn)不同的叫聲:
class Animal:def make_sound(self):print("The animal makes a sound")class Dog(Animal):def make_sound(self):print("Woof!")class Cat(Animal):def make_sound(self):print("Meow!")# 調(diào)用
dog = Dog()
cat = Cat()
dog.make_sound() # Output: Woof!
cat.make_sound() # Output: Meow!