在 Python 物件導向程式設計中,屬性和方法是類及其物件的重要組成部分。 如果說封裝、繼承和多型是物件導向程式設計的思想,那麼類的屬性和方法就是骨架,因為屬性和方法,物件導向程式設計就成了血肉之軀。
屬性是類或物件所擁有的資料,用於描述物件的特徵和狀態。 特性可以是例項屬性(特定於物件的屬性)或類屬性(屬於類本身的屬性)。 可以使用點運算子來訪問和修改屬性的值。
例項屬性是屬於物件例項的屬性。 每個物件例項都有自己的一組例項屬性,這些屬性的值可能會在物件的生存期內更改。
假設我們想定義乙個名為"car"代表汽車資訊的類具有品牌。 我們可以使用例項屬性來表示此資訊。
class car:
def __init__(self, brand):
self.brand = brand
在上面的**中,我們定義了乙個"car"類,它有乙個例項屬性:Brand。 類中的建構函式__init__
我們使用 self 關鍵字來引用當前例項物件,並使用點運算子為例項屬性賦值。 現在,我們可以建立乙個"car"物件,並訪問其實例屬性:
car1 = car("toyota")
print(car1.品牌)輸出: 豐田
在上面的**中,我們建立了乙個名為"car1"之"car"物件,並已訪問其實例屬性品牌,即輸出結果"toyota"。可以注意到,每個例項物件都有自己獨立的例項屬性集,並且可以根據特定物件的需要進行不同的分配。 例如,我們可以建立另乙個"car"物件,為其品牌屬性賦予不同的價值:
car2 = car("tesla")
print(car2.品牌)輸出:特斯拉
在上面的**中,我們建立了乙個名為"car2"之"car"物件,並已訪問其實例屬性品牌,即輸出結果"tesla"。例項屬性允許我們通過例項來描述物件的特定特徵和狀態。 每個例項物件都具有相互獨立的例項屬性,並且可以隨時修改,這使得物件導向程式設計更加靈活和可擴充套件。
類特性是屬於類的特性,它是該類的所有例項共享的特性。 類屬性獨立於任何乙個例項物件,通常用於定義類的共享資料。
假設我們想定義乙個名為"car"表示汽車資訊的類具有品牌屬性和數量屬性。 我們可以使用類屬性來表示此資訊。
class car:
brand = "toyota"
count = 0
def __init__(self, model):
self.model = model
car.count += 1
在上面的**中,我們定義了乙個"car"類,它有兩個類屬性:brand 和 count。 類中的建構函式__init__
,我們使用 self 關鍵字來引用當前例項物件,並使用點運算子為例項屬性模型賦值。 同時,每次我們建立乙個新的 CAR 物件時,我們都會在 count class 屬性的值上加 1 來統計 CAR 物件的數量。 現在,我們可以建立幾個"car"物件,並訪問其類屬性和例項屬性:
car1 = car("corolla")
car2 = car("r**4")
print(car.品牌)輸出: 豐田
print(car.count) 輸出: 2
print(car1.模型)輸出:花冠
print(car2.型號) 輸出: R**4
print(car1.品牌)輸出: 豐田
print(car2.品牌)輸出: 豐田
在上面的**中,我們建立了兩個"car"物件"car1"跟"car2"。我們首先使用類名來訪問類屬性 brand 和 count,輸出結果分別為"toyota"(全部。"car"物件的共享品牌屬性)和 2(已建立)"car"物件數)。然後,我們通過物件名稱訪問例項屬性模型,輸出結果分別為"corolla"跟"r**4"。可以注意到,每個物件例項都有自己獨立的例項屬性模型。 最後,我們通過物件名稱訪問類屬性品牌,輸出是兩者"toyota"。這是因為類屬性由類的所有例項共享,因此每個物件例項都可以訪問和修改類屬性。 類屬性允許我們在類級別定義和管理共享資料。 類的所有例項都可以通過類名訪問和修改類屬性,從而更容易以統一的方式共享和管理資料。
方法是在繫結到該類的類中定義的函式。 方法可以訪問和操作類的屬性,並且可以由類的例項呼叫。 方法分為例項方法、類方法和靜態方法。
例項方法是在類中定義的方法,它繫結到物件例項,該物件例項可以訪問方法內部的例項屬性,並用於操作物件例項的行為self
關鍵字來引用呼叫該方法的物件的例項。 假設我們仍在將其帶到"car"例如,除了原始的例項屬性外,我們還有乙個與速度相關的屬性,並顯示當前的速度。 此方法位於例項級別,表示特定物件例項的行為,我們可以使用 instance 方法實現該行為。
class car:
def __init__(self, brand, model):
self.brand = brand
self.model = model
self.speed = 0
def accelerate(self, increment):
self.speed += increment
def decelerate(self, decrement):
if self.speed >= decrement:
self.speed -= decrement
else:self.speed = 0
def show_speed(self):
print("current speed:", self.speed, "km/h")
在上面的**中,我們定義了乙個"car"類,它有三個例項屬性:Brand、Model 和 Speed。 此外,我們還定義了三種例項方法:加速、減速和顯示速度。 在該方法中,我們使用 self 關鍵字來引用當前例項物件的屬性,並通過增加或減少 speed 屬性來加速和減速。 show speed 方法用於在終端中顯示當前汽車的速度資訊。 現在,我們可以建立乙個"car"物件,並呼叫其實例方法:
car1 = car("toyota", "corolla")
car1.accelerate(40)
car1.show speed() 輸出: 當前速度: 40 km h
car1.decelerate(20)
car1.show speed() 輸出: 當前速度: 20 km h
在上面的**中,我們建立了乙個名為"car1"之"car"物件,然後呼叫其 accelerate 和 then deelerate 方法。 然後,通過呼叫show speed方法列印出當前汽車的速度資訊。
例項方法允許我們為物件例項定義特定行為。 每個例項物件都可以呼叫乙個例項方法,每次呼叫該方法時,該方法都可以根據物件例項的特定屬性值在內部執行不同的操作。 這使我們能夠輕鬆操作和控制物件行為,從而實現更靈活和可定製的功能。 以汽車為例,我們通過示例方法實現了汽車的加速、減速、顯示速度等功能。
類方法是繫結到類本身的方法,類方法由可以訪問和修改方法內部的類屬性的裝飾器@classmethod標記。 與例項方法不同,類方法對整個類進行操作,不依賴於特定的例項物件。 下面是乙個示例,用於詳細說明類方法的概念和用法。
class car:
total_cars = 0
def __init__(self, brand, model):
self.brand = brand
self.model = model
car.total_cars += 1
classmethod
def get_total_cars(cls):
return cls.total_cars
在上面的**中,我們定義了乙個"car"類,它有兩個例項屬性:brand 和 model,以及乙個類屬性 Total cars。 此外,我們還使用 classMethod 修飾器修飾了 Get Total Cars 方法,將其定義為類方法。 在 Get Total Cars 方法中,我們通過 cls 關鍵字引用當前類物件,這使我們能夠訪問類屬性 Total Cars。 現在,我們可以建立多個"car"物件並呼叫類方法:
car1 = car("toyota", "corolla")
car2 = car("honda", "civic")
car3 = car("ford", "mustang")
print(car.獲取 total cars()) 輸出: 3
在上面的**中,我們建立了三個不同的"car"object 並獲取通過呼叫 class 方法 get total cars 建立的 Car 物件的數量。 輸出為 3,表示已建立三個 CAR 物件。 需要注意的是,類方法可以直接通過類名呼叫,不需要建立物件例項。 而且,無論類方法是由類名還是物件例項呼叫,它們都能夠訪問和操作類級屬性和方法。 類方法通常用於處理類級操作,例如計數器、對類屬性的訪問和修改。 在汽車示例中,我們使用類方法 Get Total Cars 來獲取到目前為止已建立的汽車物件的數量,因為汽車總數由整個類共享。
靜態方法在乙個類中定義,靜態方法獨立於物件例項和類中的類,用裝飾器@staticmethod標記,與例項方法和類方法不同,靜態方法不需要訪問例項屬性或類屬性,它是一種獨立於例項和類的方法。
class car:
def __init__(self, brand, model, distance, time):
self.brand = brand
self.model = model
self.distance = distance
self.time = time
staticmethod
def calculate_**erage_speed(distance, time):
return distance / time
def get_info(self):
print(f"brand: ")
print(f"model: ")
print(f"distance: km")
print(f"time: hours")
print(f"**erage speed: km/h")
car = car("toyota", "corolla", 400, 5)
car.get_info()
在上面的**中,我們定義了乙個"car"類中,建構函式接收四個引數:Make、Model、Distance Traveled 和 Time Required。 然後,我們使用靜態方法calculate_**erage_speed
計算平均速度,即行進距離除以所需時間。 在get_info
在該方法中,我們列印汽車的品牌、型號、行駛距離、所需時間和平均速度(通過呼叫靜態方法)。
執行上述 **,您將獲得以下輸出:
brand: toyota
model: corolla
distance: 400 km
time: 5 hours
*erage speed: 80.0 km/h
從輸出中可以看出,我們成功獲取了汽車的資訊並計算了平均速度。 通過使用靜態方法,我們封裝了計算類中平均速度的邏輯,使其更加清晰和可維護。 同時,靜態方法可以直接通過類名呼叫,而無需先建立 car 物件的例項。 需要注意的是,靜態方法可以由類中的所有例項共享,也可以由類本身直接呼叫。 靜態方法提供了一種方便的方式來執行與類相關的操作,而無需訪問例項或類屬性。