當我深入學習了物件導向程式設計之後,我首先感受到的是程式碼編寫的自由度大幅提升。不同於Java中嚴格的結構和約束,Python在物件導向的實現中展現出更加靈活和自由的特性。它使用了一些獨特的關鍵字,如self和cls,這些不僅增強了程式碼的可讀性,還提供了對類和例項的明確引用。正如Java,Python也依賴於物件和類的概念,允許我們透過定義類來建立和操作物件。儘管在表面上Python和Java在物件導向的實現上看似相似,但實際上,它們在細節處理上存在一些顯著的差異。接下來,我們將探索這些差異,並深入瞭解它們在實際應用中的具體表現,以便更好地理解物件導向程式設計在不同語言中的獨特風格和優勢。
Python中的類宣告
首先,你需要宣告一個類。在Python中,這通常是透過使用class關鍵字來完成的。下面是一個簡單的類宣告的示例:
class MyClass:
myAttr = "類的屬性"
def __init__(self, attribute):
self.attribute = attribute
def my_method(self):
return f"Value of attribute is {self.attribute}"
關於上面的類宣告你可能發現了attribute和myAttr屬性不一樣,不報錯嗎?這就是Python的特點:動態屬性賦值。在Python中,不僅可以在類的初始化方法__init__中直接定義新的屬性,還可以在物件建立之後的任何時刻動態地新增屬性,這種做法在Java中會引發錯誤,但在Python中卻是完全合法的,反映了其動態型別的本質。下面再詳細說下。
在Java中,this關鍵字是隱式的,用於指代當前物件的例項,而在Python中,self必須顯式宣告並作為方法的第一個引數傳遞。
返回值裡的f
在這裡表示格式化,它使得在字串中直接嵌入表示式成為可能。Python會自動進行求值並將結果轉換為字串。
建立物件
一旦定義了類,就可以使用該類來建立物件。這是透過簡單地呼叫類名並傳遞必要的引數來完成的。例如:
my_object = MyClass("Hello")
my_object.subAttr = "是子類的"
print(my_object.subAttr) #輸出:是子類的
print(my_object.my_method()) # 輸出:Value of attribute is Hello
雖然在Python中,self關鍵字需要顯式地在方法定義中指出,但其實它的作用與Java中的this關鍵字相似,代表著方法所屬的物件例項。在呼叫例項方法時,Python會自動將物件例項作為第一個引數傳遞給self,因此在正常使用例項方法時,我們無需顯式地傳遞這個引數。例如,在呼叫my_object.my_method()時,my_object例項會自動作為self引數傳遞給my_method。這種機制確保了方法能夠訪問和操作所屬物件例項的資料。
如果嘗試直接透過類名來呼叫例項方法,如MyClass.my_method(),將會引發錯誤。這是因為沒有提供必要的例項引數,導致self沒有被正確初始化。要想透過類名呼叫方法,方法必須是類方法或靜態方法。來看下
類方法和靜態方法
在Python中,@classmethod和@staticmethod是兩種常用的方法裝飾器,它們分別用於定義類方法和靜態方法。
其特點是第一個引數通常是cls,代表著類本身。這與例項方法中的self引數相似,但有一個重要的區別:cls引數指向類,而不是類的某個特定例項。類方法的一個限制是它們無法訪問特定例項的屬性,因為它們不與任何例項繫結。
class MyClass:
@classmethod
def my_class_method(cls):
# 可以訪問類屬性,如cls.some_class_attribute
return "這是一個類方法"
靜態方法實際上是獨立於類的例項和類本身的。靜態方法不接收傳統意義上的self或cls引數,這意味著它們既不能訪問類的例項屬性(即物件級別的資料),也不能訪問類屬性(即與類本身相關聯的資料)。靜態方法的這種特性使得它們更像是普通函式,但為了邏輯上的整潔和組織性,它們被放置在類的定義中。
class MyClass:
@staticmethod
def my_static_method():
return "這是一個靜態方法"
總結
作為一名有著Java背景的開發者,你無疑已經習慣了Java那嚴格的型別系統和細緻的訪問控制機制。轉向Python,你會發現一個截然不同的程式設計世界。Python的物件導向程式設計(OOP)方式為程式碼組織提供了更高的自由度和靈活性,這種變化可能會給你帶來新鮮感,同時也是一個挑戰。需要注意的是,Python的這種靈活性可能會導致更少的編譯時錯誤檢查。由於Python是一種解釋型語言,很多錯誤只有在執行時才會被捕捉到。