wordpress過(guò)時(shí)了嗎手機(jī)百度seo快速排名
Python青少年簡(jiǎn)明教程:類和對(duì)象入門
Python支持多種編程范式(programming paradigms),即支持多種不同的編程風(fēng)格和方法。初學(xué)者開(kāi)始重點(diǎn)學(xué)習(xí)關(guān)注的編程范式,一般而言是面向過(guò)程編程和面向?qū)ο缶幊獭C嫦蜻^(guò)程編程(Procedural Programming)它關(guān)注于通過(guò)過(guò)程(或稱為函數(shù)、子程序)來(lái)組織程序的邏輯。它是命令式編程(Imperative Programming)的一種具體風(fēng)格。
【Python也支持函數(shù)式編程(Functional Programming)的一些特性,如lambda函數(shù)、map()、filter()等。
Python也支持事件驅(qū)動(dòng)編程(Event-Driven Programming),這編程范式特別適用于創(chuàng)建響應(yīng)式和交互式的應(yīng)用程序。Python提供了多種方式來(lái)實(shí)現(xiàn)事件驅(qū)動(dòng)編程:使用標(biāo)準(zhǔn)的(內(nèi)置的)庫(kù)tkinter(Python的標(biāo)準(zhǔn)GUI庫(kù),適合創(chuàng)建簡(jiǎn)單的桌面應(yīng)用), 標(biāo)準(zhǔn)庫(kù)中的asyncio模塊(提供了對(duì)異步編程的支持。它可以處理事件循環(huán)、協(xié)程、任務(wù)和事件驅(qū)動(dòng)編程), 一些第三方庫(kù)(如PyQt用于創(chuàng)建GUI應(yīng)用,pygame:用于游戲開(kāi)發(fā))等。】
前面的介紹的編程,主要是面向過(guò)程編程(Procedural Programming)它關(guān)注于通過(guò)過(guò)程(或稱為函數(shù)、子程序)來(lái)組織程序的邏輯。它是命令式編程(Imperative Programming)的一種具體風(fēng)格。
作為對(duì)比,先概括面向過(guò)程編程風(fēng)格的特點(diǎn)。面向過(guò)程編程是命令式編程的一種具體風(fēng)格。它主要關(guān)注于:
??? 將程序分解為一系列的過(guò)程(也稱為函數(shù)或子程序)
??? 這些過(guò)程按順序執(zhí)行,每個(gè)過(guò)程執(zhí)行特定的任務(wù)
??? 強(qiáng)調(diào)代碼的重用和模塊化
示例:
def calculate_area(length, width):return length * widthdef calculate_perimeter(length, width):return 2 * (length + width)# 使用函數(shù)
room_length = 5
room_width = 4
area = calculate_area(room_length, room_width)
perimeter = calculate_perimeter(room_length, room_width)print(f"房間面積:{area}平方米")
print(f"房間周長(zhǎng):{perimeter}米")
面向?qū)ο缶幊棠?#xff1f;這是另一種重要的范式,它主要關(guān)注于:
??? 將數(shù)據(jù)和操作數(shù)據(jù)的方法組織到對(duì)象中
??? 使用類來(lái)創(chuàng)建對(duì)象
??? 支持封裝、繼承和多態(tài)等概念
示例:
class Room:def __init__(self, length, width):self.length = lengthself.width = widthdef calculate_area(self):return self.length * self.widthdef calculate_perimeter(self):return 2 * (self.length + self.width)# 使用類
my_room = Room(5, 4)
print(f"房間面積:{my_room.calculate_area()}平方米")
print(f"房間周長(zhǎng):{my_room.calculate_perimeter()}米")
下面將介紹Python面向?qū)ο缶幊讨R(shí)。
Python是一種面向?qū)ο缶幊?#xff08;OOP)的語(yǔ)言,類和對(duì)象是其核心概念。
類(Class)
類 是對(duì)象的藍(lán)圖或模板,它定義了一組屬性和方法,這些屬性和方法被具體的對(duì)象實(shí)例所共享。
基本語(yǔ)法:
class ClassName:
? ? # 類體
? ? pass
【注:pass 是一個(gè)特殊語(yǔ)句,它主要用作占位符,不會(huì)改變程序的執(zhí)行流程,但pass 是一個(gè)語(yǔ)句,是一個(gè)語(yǔ)法上的無(wú)操作語(yǔ)句,它的出現(xiàn)能避免不寫任何語(yǔ)句時(shí)的語(yǔ)法錯(cuò)誤?!?/p>
下面給出定義類的包含比較全面的語(yǔ)法:
class ClassName:
? ? # 類屬性
? ? class_attribute = value
? ? # 初始化方法
? ? def __init__(self, parameter1, parameter2):
? ? ? ? self.instance_attribute1 = parameter1
? ? ? ? self.instance_attribute2 = parameter2
? ? # 實(shí)例方法
? ? def instance_method(self):
? ? ? ? # 方法體
? ? ? ? pass
? ? # 類方法
? ? @classmethod
? ? def class_method(cls):
? ? ? ? # 方法體
? ? ? ? pass
? ? # 靜態(tài)方法
? ? @staticmethod
? ? def static_method():
? ? ? ? # 方法體
? ? ? ? pass
類和對(duì)象的說(shuō)明:
屬性 (Attributes): 對(duì)象具有的數(shù)據(jù)。
方法 (Methods): 對(duì)象可以執(zhí)行的操作。
實(shí)例化 (Instantiation): 使用類創(chuàng)建對(duì)象的過(guò)程。
self: 在方法定義中,self 代表當(dāng)前對(duì)象,用于訪問(wèn)修改對(duì)象的屬性和方法。
實(shí)例屬性:定義在 __init__ 方法中的屬性,用 self 引用。每個(gè)對(duì)象都有自己獨(dú)立的實(shí)例屬性。
類屬性:在類體內(nèi)直接定義,用 ClassName.attribute 或 self.__class__.attribute 引用。所有對(duì)象共享類屬性。
實(shí)例方法:定義在類內(nèi)部,以 self 作為第一個(gè)參數(shù)的方法。用于操作對(duì)象實(shí)例的屬性。
類方法:使用 @classmethod 裝飾器定義,以 cls 作為第一個(gè)參數(shù)的方法。用于操作類屬性。
靜態(tài)方法:使用 @staticmethod 裝飾器定義,不需要 self 或 cls 參數(shù)。通常與類或?qū)嵗裏o(wú)關(guān)。
必須的部分:
class ClassName: 這是定義類的基本語(yǔ)法,是必須的。
常用但不是必須的部分:
__init__ 方法:雖然不是嚴(yán)格必需的,但在大多數(shù)情況下都會(huì)定義,用于初始化對(duì)象。
實(shí)例屬性:通常在 __init__ 中定義,但也可以在其他方法中定義。
可選但常見(jiàn)的部分:
類屬性:不是必須的,但在需要所有實(shí)例共享某些屬性時(shí)很有用。
實(shí)例方法:定義對(duì)象的行為,是面向?qū)ο缶幊痰暮诵?#xff0c;但并非每個(gè)類都必須有。
類方法和靜態(tài)方法:這些是更高級(jí)的概念,根據(jù)具體需求使用。
另外,Python 使用命名約定(如單下劃線前綴)來(lái)表示私有或保護(hù)成員,而不是嚴(yán)格的訪問(wèn)控制。
需要注意,重要的是理解這些組件的作用,并根據(jù)具體情況選擇使用。過(guò)度設(shè)計(jì)(如在不需要的地方使用類方法或靜態(tài)方法)可能會(huì)使代碼不必要地復(fù)雜。
Python類中各種成員的用途和注意事項(xiàng):
☆類屬性(Class Attributes)
用途:
??? 存儲(chǔ)所有實(shí)例共享的數(shù)據(jù)
??? 定義類級(jí)別的常量
??? 跟蹤類的全局狀態(tài)
注意事項(xiàng):
??? 可以通過(guò)類名或?qū)嵗L問(wèn)
??? 修改時(shí)要小心,因?yàn)闀?huì)影響所有實(shí)例
??? 可能被實(shí)例屬性覆蓋
☆實(shí)例屬性(Instance Attributes)
用途:
??? 存儲(chǔ)每個(gè)實(shí)例特有的數(shù)據(jù)
??? 定義對(duì)象的狀態(tài)
注意事項(xiàng):
??? 通常在__init__方法中初始化,使用self定義的變量
??? 只能通過(guò)實(shí)例訪問(wèn)
??? 每個(gè)實(shí)例可以有不同的值
☆實(shí)例方法(Instance Methods)
用途:
??? 定義對(duì)象的行為
??? 操作實(shí)例的狀態(tài)
注意事項(xiàng):
??? 第一個(gè)參數(shù)總是self,代表實(shí)例本身
??? 可以訪問(wèn)和修改實(shí)例屬性
??? 通過(guò)實(shí)例調(diào)用
☆類方法(Class Methods)
用途:
??? 操作類屬性
??? 實(shí)現(xiàn)替代構(gòu)造器
注意事項(xiàng):
??? 使用@classmethod裝飾器
??? 第一個(gè)參數(shù)通常命名為cls,代表類本身
??? 可以通過(guò)類或?qū)嵗{(diào)用
??? 不能直接訪問(wèn)實(shí)例屬性
☆靜態(tài)方法(Static Methods)
用途:
??? 實(shí)現(xiàn)與類相關(guān)但不需要訪問(wèn)類或?qū)嵗隣顟B(tài)的功能
??? 組織代碼結(jié)構(gòu)
注意事項(xiàng):
??? 使用@staticmethod裝飾器
??? 不需要特殊的首參數(shù)
??? 可以通過(guò)類或?qū)嵗{(diào)用(不建議通過(guò)實(shí)例調(diào)用)
??? 不能訪問(wèn)類或?qū)嵗龑傩?/p>
☆魔術(shù)方法(Magic Methods),也稱為特殊方法
用途:
??? 定制類的特殊行為,用于實(shí)現(xiàn)特定的功能,如對(duì)象初始化、字符串表示、運(yùn)算符重載等。
注意事項(xiàng):
??? 以雙下劃線開(kāi)始和結(jié)束,如__init__、str、__len__等
??? 在特定情況下自動(dòng)調(diào)用
??? 可以極大地增強(qiáng)類的功能和靈活性
☆屬性裝飾器(Property Decorators)
用途:
??? 將方法調(diào)用偽裝成屬性訪問(wèn)(可以像訪問(wèn)屬性一樣訪問(wèn))
??? 實(shí)現(xiàn)計(jì)算屬性
??? 控制屬性的訪問(wèn)、設(shè)置和刪除
注意事項(xiàng):
??? 使用@property裝飾器
??? 可以定義getter、setter和deleter
??? 提供了一種優(yōu)雅的方式來(lái)封裝數(shù)據(jù)訪問(wèn)
☆內(nèi)部類(Nested Classes)
用途:
??? 將相關(guān)類組織在一起
??? 封裝輔助類
注意事項(xiàng):
??? 定義在另一個(gè)類的內(nèi)部
??? 可以訪問(wèn)外部類的屬性
??? 通常用于實(shí)現(xiàn)輔助功能或數(shù)據(jù)結(jié)構(gòu)
☆私有成員(Private Members)
用途:
??? 隱藏實(shí)現(xiàn)細(xì)節(jié)
??? 防止直接訪問(wèn)和修改
注意事項(xiàng):
??? 以雙下劃線__開(kāi)頭
??? Python通過(guò)名稱改寫機(jī)制實(shí)現(xiàn)
??? 可以通過(guò)特殊方式訪問(wèn),不是絕對(duì)私有
☆保護(hù)成員(Protected Members)
用途:
??? 表示應(yīng)該被視為內(nèi)部使用的成員
??? 在繼承中使用
注意事項(xiàng):
??? 以單下劃線_開(kāi)頭
??? 這只是一個(gè)約定,并不強(qiáng)制執(zhí)行,實(shí)際可以被外部訪問(wèn),但不應(yīng)該
特別提示,實(shí)際使用時(shí),合理使用各種成員類型,有些部分不一定出現(xiàn),選擇合適的類型可以使您的代碼更加清晰和高效。
Python類的成員類型和概念很多,一次性全部掌握是有難度的。這是很正常的學(xué)習(xí)過(guò)程,可以先集中精力關(guān)注您不需要一次掌握所有內(nèi)容。隨著您編寫更多的Python代碼,這些概念會(huì)變得越來(lái)越清晰。最常用的部分,如實(shí)例屬性、實(shí)例方法、類方法和靜態(tài)方法。基礎(chǔ)示例:
class Car:total_cars = 0 # 類屬性def __init__(self, make, model):self.make = make # 實(shí)例屬性self.model = model # 實(shí)例屬性Car.total_cars += 1def display_info(self): # 實(shí)例方法return f"{self.make} {self.model}"@classmethoddef get_total_cars(cls): # 類方法return cls.total_cars@staticmethoddef honk(): # 靜態(tài)方法return "Beep beep!"# 使用類
my_car = Car("Toyota", "Corolla")
print(my_car.display_info()) # 輸出: Toyota Corolla
print(Car.get_total_cars()) # 輸出: 1
print(Car.honk()) # 輸出: Beep beep!
這個(gè)例子涵蓋了基本的類屬性、實(shí)例屬性、實(shí)例方法、類方法和靜態(tài)方法。您可以從這里開(kāi)始,逐步理解每個(gè)概念的作用和使用場(chǎng)景。
Python 中類的方法確實(shí)與普通函數(shù)比較
在 Python 中,類的方法確實(shí)與普通函數(shù)在很多方面都是類似的。兩張比較如下:
相似之處:
a) 定義方式:
類方法和普通函數(shù)都使用 def 關(guān)鍵字定義。
b) 參數(shù)傳遞:
兩者都可以接受位置參數(shù)、關(guān)鍵字參數(shù)、默認(rèn)參數(shù)、*args 和 **kwargs。
c) 返回值:
兩者都可以有返回值,使用 return 語(yǔ)句。
d) 文檔字符串:
兩者都可以使用文檔字符串(docstrings)來(lái)描述其功能。
e) 裝飾器:
兩者都可以使用裝飾器來(lái)修改或增強(qiáng)功能。
主要區(qū)別:
a) self 參數(shù):
類方法的第一個(gè)參數(shù)通常是 self,代表類的實(shí)例。普通函數(shù)沒(méi)有這個(gè)要求。
b) 訪問(wèn)范圍:
類方法可以訪問(wèn)類的屬性和其他方法,而普通函數(shù)不能直接訪問(wèn)類的內(nèi)部結(jié)構(gòu)。
c) 調(diào)用方式:
類方法通常通過(guò)類的實(shí)例調(diào)用,而普通函數(shù)直接調(diào)用。
d) 特殊方法:
類可以有特殊方法(如 __init__, __str__ 等),這在普通函數(shù)中不存在。
讓我們通過(guò)一個(gè)例子來(lái)說(shuō)明這些相似點(diǎn)和區(qū)別:
# 普通函數(shù)
def regular_function(x, y, *args, **kwargs):"""這是一個(gè)普通函數(shù)的文檔字符串"""print(f"Regular function: x={x}, y={y}, args={args}, kwargs={kwargs}")# 類定義
class ExampleClass:def __init__(self, name):self.name = namedef class_method(self, x, y, *args, **kwargs):"""這是一個(gè)類方法的文檔字符串"""print(f"{self.name}: x={x}, y={y}, args={args}, kwargs={kwargs}")@staticmethoddef static_method(x, y):"""這是一個(gè)靜態(tài)方法"""print(f"Static method: x={x}, y={y}")# 使用普通函數(shù)
regular_function(1, 2, 3, 4, a=5, b=6) # 輸出:Regular function: x=1, y=2, args=(3, 4), kwargs={'a': 5, 'b': 6}# 使用類方法
obj = ExampleClass("MyObject")
obj.class_method(1, 2, 3, 4, a=5, b=6) # 輸出:MyObject: x=1, y=2, args=(3, 4), kwargs={'a': 5, 'b': 6}# 使用靜態(tài)方法
ExampleClass.static_method(1, 2) # 輸出:Static method: x=1, y=2
這個(gè)例子展示了普通函數(shù)和類方法在定義和使用上的相似性,同時(shí)也突出了它們的一些區(qū)別,特別是 self 參數(shù)的使用和調(diào)用方式的不同。
總的來(lái)說(shuō),Python 的設(shè)計(jì)使得類方法在使用上感覺(jué)非常像普通函數(shù),這是 Python 簡(jiǎn)潔和一致性設(shè)計(jì)哲學(xué)的體現(xiàn)。這種相似性使得從函數(shù)式編程轉(zhuǎn)向面向?qū)ο缶幊套兊孟鄬?duì)容易。
下面介紹封裝(Encapsulation)、繼承(Inheritance)和多態(tài)(Polymorphism)等內(nèi)容,很重要,但涉及內(nèi)容廣泛,在此僅作簡(jiǎn)要介紹,作為初學(xué)者可以先作為了解內(nèi)容。
封裝(Encapsulation)
封裝是將數(shù)據(jù)(屬性)和行為(方法)隱藏在類內(nèi)部,只通過(guò)公開(kāi)的方法訪問(wèn)。
私有屬性和方法:通過(guò)在屬性或方法名前加兩個(gè)下劃線 __ 實(shí)現(xiàn)。示例:
class Person:def __init__(self, name, age):self.__name = name # 私有屬性self.__age = agedef get_name(self):return self.__namedef get_age(self):return self.__ageperson = Person("Alice", 30)
print(person.get_name()) # 輸出: Alice
print(person.get_age()) # 輸出: 30
# print(person.__name) # 會(huì)報(bào)錯(cuò),無(wú)法直接訪問(wèn)私有屬性
在 Python 中,高級(jí)封裝可以屬性裝飾器(@property)和property()函數(shù)。
Python中的property:@property裝飾器和 property() 函數(shù),它們都是用來(lái)創(chuàng)建托管屬性(managed properties)的機(jī)制,允許你對(duì)屬性的獲取、設(shè)置和刪除操作進(jìn)行精細(xì)控制。這兩種方法本質(zhì)上是實(shí)現(xiàn)相同功能(功能等價(jià))的不同語(yǔ)法。這是一種更現(xiàn)代、更簡(jiǎn)潔的語(yǔ)法,通常在新代碼中更常用。property()函數(shù)這是較早的語(yǔ)法,但仍然完全有效和有用。@property裝飾器實(shí)際上是property()函數(shù)的語(yǔ)法糖。
選擇哪種主要取決于個(gè)人偏好和具體的使用場(chǎng)景。
Python使用裝飾器(@property)來(lái)實(shí)現(xiàn)getter和setter的功能。例如:
class Circle:def __init__(self, radius):self._radius = radius@propertydef radius(self):"""Getter for radius"""return self._radius@radius.setterdef radius(self, value):"""Setter for radius"""if value <= 0:raise ValueError("半徑必須為正數(shù)")self._radius = value@propertydef area(self):"""Getter for area"""return 3.14 * self._radius ** 2circle = Circle(5)
print(circle.radius) # 輸出: 5
circle.radius = 10 # 使用setter
print(circle.radius) # 輸出: 10
print(circle.area) # 輸出: 約 314.0# circle.radius = -1 # 會(huì)拋出 ValueError: 半徑必須為正數(shù)
說(shuō)明(解釋):
a. @property裝飾器:
??? 將方法轉(zhuǎn)換為只讀屬性
??? 通常用作getter
b. @[屬性名].setter裝飾器:
??? 定義屬性的setter方法
??? 允許設(shè)置屬性值時(shí)進(jìn)行驗(yàn)證或處理
c. 只讀屬性:
??? 只定義@property而不定義setter,創(chuàng)建只讀屬性
property()函數(shù)
property() 函數(shù)是 Python 內(nèi)置函數(shù),用于創(chuàng)建和返回 property 對(duì)象。它提供了另一種方式來(lái)定義屬性,而不是使用裝飾器語(yǔ)法。
property() 函數(shù)的基本語(yǔ)法是:
property(fget=None, fset=None, fdel=None, doc=None)
其中:
??? fget:獲取屬性值的函數(shù)(getter)
??? fset:設(shè)置屬性值的函數(shù)(setter)
??? fdel:刪除屬性的函數(shù)(可選)
??? doc:屬性的文檔字符串(可選)
例如(一個(gè)完整的、可運(yùn)行的使用property() 函數(shù)示例):
class Circle:def __init__(self, radius):self._radius = radiusdef get_radius(self):print("Getting radius")return self._radiusdef set_radius(self, value):print("Setting radius")if value <= 0:raise ValueError("半徑必須為正數(shù)")self._radius = valuedef del_radius(self):print("Deleting radius")del self._radiusradius = property(get_radius, set_radius, del_radius, "圓的半徑屬性")# 使用這個(gè)類
circle = Circle(5)print(circle.radius) # 獲取半徑
circle.radius = 10 # 設(shè)置半徑
print(circle.radius) # 再次獲取半徑
del circle.radius # 刪除半徑# 查看屬性的文檔
print(Circle.radius.__doc__)# 嘗試設(shè)置無(wú)效值
try:circle.radius = -1
except ValueError as e:print(f"錯(cuò)誤: {e}")
說(shuō)明(解釋):
我們定義了 get_radius、set_radius 和 del_radius 方法。
使用 property() 函數(shù)創(chuàng)建了 radius 屬性,將這些方法關(guān)聯(lián)起來(lái)。
當(dāng)我們?cè)L問(wèn)、修改或刪除 radius 屬性時(shí),相應(yīng)的方法被調(diào)用。
我們還可以訪問(wèn)屬性的文檔字符串。
當(dāng)嘗試設(shè)置無(wú)效值時(shí),會(huì)引發(fā) ValueError。
使用 property() 函數(shù)的優(yōu)點(diǎn)是它提供了一種更靈活的方式來(lái)定義屬性,特別是在需要?jiǎng)討B(tài)創(chuàng)建屬性或在運(yùn)行時(shí)修改屬性行為時(shí)。然而,對(duì)于大多數(shù)簡(jiǎn)單的情況,使用 @property 裝飾器語(yǔ)法通常更為簡(jiǎn)潔和常見(jiàn)。
運(yùn)行這個(gè)程序的輸出是:
Getting radius
5
Setting radius
Getting radius
10
Deleting radius
圓的半徑屬性
Setting radius
錯(cuò)誤: 半徑必須為正數(shù)
繼承(Inheritance)
繼承是面向?qū)ο缶幊讨械囊粋€(gè)重要概念,它允許一個(gè)類(子類)繼承另一個(gè)類(父類)的屬性和方法。
定義子類的語(yǔ)法:
class SubClass(ParentClass):
? ? # 子類定義
?
示例:
class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("Subclass must implement this method")class Cat(Animal):def speak(self):return f"{self.name} says meow"class Dog(Animal):def speak(self):return f"{self.name} says woof"cat = Cat("Whiskers")
dog = Dog("Buddy")print(cat.speak()) # 輸出: Whiskers says meow
print(dog.speak()) # 輸出: Buddy says woof
多重繼承(Multiple Inheritance)
Python 支持多重繼承,一個(gè)子類可以繼承多個(gè)父類。
語(yǔ)法:
class SubClass(ParentClass1, ParentClass2):
? ? # 子類定義
示例:
class Swimmable:def swim(self):return "I can swim"class Flyable:def fly(self):return "I can fly"class Duck(Swimmable, Flyable):passduck = Duck()
print(duck.swim()) # 輸出: I can swim
print(duck.fly()) # 輸出: I can fly
多態(tài)(Polymorphism)
在 Python 中,多態(tài)(Polymorphism)是指不同的對(duì)象對(duì)同一操作的不同響應(yīng)方式。這意味著,您可以用相同的方式處理不同類型的對(duì)象,而不需要了解它們具體的類型。多態(tài)通常通過(guò)繼承與方法重寫(override)來(lái)實(shí)現(xiàn)。例如:
class Shape:def area(self):passclass Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2def print_area(shape):print(f"The area is: {shape.area()}")# 創(chuàng)建不同的形狀
rect = Rectangle(5, 4)
circ = Circle(3)# 用相同的函數(shù)處理不同的對(duì)象
print_area(rect) # 輸出: The area is: 20
print_area(circ) # 輸出: The area is: 28.26
說(shuō)明,在這個(gè)例子中:
Shape 是一個(gè)基類,定義了 area 方法。
Rectangle 和 Circle 繼承自 Shape,并重寫了 area 方法。
print_area 函數(shù)接受一個(gè) Shape 對(duì)象,并調(diào)用其 area 方法。
我們可以傳入 Rectangle 或 Circle 的實(shí)例,print_area 函數(shù)會(huì)正確調(diào)用相應(yīng)的 area 方法。
這個(gè)例子展示了如何通過(guò)繼承和方法重寫來(lái)實(shí)現(xiàn)多態(tài),也展示了如何用相同的方式(調(diào)用 print_area 函數(shù))處理不同類型的對(duì)象。
方法重寫(Method Overriding)
子類可以重寫父類的方法,提供自己的實(shí)現(xiàn)。
示例:
class Bird:def speak(self):return "Bird sound"class Parrot(Bird):def speak(self):return "Parrot says squawk"bird = Bird()
parrot = Parrot()print(bird.speak()) # 輸出: Bird sound
print(parrot.speak()) # 輸出: Parrot says squawk
最后總結(jié)一下Python中的self的作用。
self小結(jié):
Python中的self是一個(gè)在面向?qū)ο缶幊讨蟹浅V匾母拍?。self 是一個(gè)約定俗成的名稱,通常用于代表一個(gè)類的實(shí)例。它作為實(shí)例方法的第一個(gè)參數(shù)來(lái)訪問(wèn)對(duì)象的屬性和方法。 self 的作用:
1)用于訪問(wèn)和修改實(shí)例變量(也稱為實(shí)例的屬性)。
2)用于調(diào)用其他實(shí)例方法。
示例:
class Person:def __init__(self, name, age):self.name = name # 使用 self 設(shè)置實(shí)例變量self.age = agedef introduce(self):print(f"我是 {self.name},今年 {self.age} 歲") # 使用 self 訪問(wèn)實(shí)例變量def have_birthday(self):self.age += 1 # 使用 self 修改實(shí)例變量self.introduce() # 使用 self 調(diào)用其他實(shí)例方法# 創(chuàng)建實(shí)例
person = Person("Alice", 30)
person.introduce() # 輸出:我是 Alice,今年 30 歲
person.have_birthday() # 輸出:我是 Alice,今年 31 歲
關(guān)于self重要說(shuō)明
self 必須作為第一個(gè)參數(shù)傳遞給實(shí)例方法,但在調(diào)用時(shí)不需要傳遞,Python 會(huì)自動(dòng)處理。
self不是Python的關(guān)鍵字,而是個(gè)常用約定,但你可以使用其他名稱,但是不建議這樣做,以保持代碼的可讀性和一致性。
在__init__中,self指向新創(chuàng)建的實(shí)例。(__init__是一個(gè)特殊方法,用于初始化新創(chuàng)建的對(duì)象。)
訪問(wèn)實(shí)例變量時(shí)總是需要使用self前綴。
實(shí)例方法的定義需要包含self,在類方法 (使用@classmethod裝飾器) 和靜態(tài)方法 (使用@staticmethod裝飾器) 中,self 不再使用,類方法使用cls作為第一個(gè)參數(shù);靜態(tài)方法不使用特殊的第一個(gè)參數(shù)。
在子類中,self仍然指向當(dāng)前實(shí)例,即使方法是從父類繼承的。
附錄
Python面向?qū)ο蟪绦蛟O(shè)計(jì) https://blog.csdn.net/cnds123/article/details/108354860
Python中的property介紹 https://blog.csdn.net/cnds123/article/details/129420059