Java開發者的Python快速進修指南:面向對象基礎

来源:https://www.cnblogs.com/guoxiaoyu/archive/2023/11/24/17837261.html
-Advertisement-
Play Games

作為一名有著Java背景的開發者,你無疑已經習慣了Java那嚴格的類型系統和細緻的訪問控制機制。轉向Python,你會發現一個截然不同的編程世界。Python的面向對象編程(OOP)方式為代碼組織提供了更高的自由度和靈活性,這種變化可能會給你帶來新鮮感,同時也是一個挑戰。需要註意的是,Python的... ...


當我深入學習了面向對象編程之後,我首先感受到的是代碼編寫的自由度大幅提升。不同於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是一種解釋型語言,很多錯誤只有在運行時才會被捕捉到。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 來源:levelup.gitconnected.com/how-to-design-a-system-to-scale-to-your-first-100-million-users-4450a2f9703d 1 從頭開始 2 可擴展性的藝術 3 使用負載均衡器來均衡所有節點上的流量 4 擴展關係數 ...
  • 因PDF文檔具有較好的穩定性和相容性,現在越來越多的合同、研究論文、報告等都採用PDF格式。為了進一步保護這些重要文檔內容免受未經授權的複製或使用,我們可以添加水印以表明其狀態、所有權或用途。針對工作中可能出現的在 C++ 應用程式中給 PDF 文檔添加文字水印的需求,本文將詳細展示如何通過第三方國 ...
  • wmproxy wmproxy已用Rust實現http/https代理, socks5代理, 反向代理, 靜態文件伺服器,四層TCP/UDP轉發,七層負載均衡,內網穿透,後續將實現websocket代理等,會將實現過程分享出來,感興趣的可以一起造個輪子 項目地址 國內: https://gitee. ...
  • 消息系統 消息系統被用於各種場景,如解耦數據生產者,緩存未處理的消息。Kafka 可作為傳統的消息系統的替代者,與傳統消息系統相比,kafka有更好的吞吐量、更好的可用性,這有利於處理大規模的消息。 根據經驗,通常消息傳遞對吞吐量要求較低,但可能要求較低的端到端延遲,並經常依賴kafka可靠的dur ...
  • IJPay 的宗旨是讓支付觸手可及。封裝了微信支付、QQ 支付、支付寶支付、京東支付、銀聯支付、PayPal 支付等常用的支付方式以及各種常用的介面。 ...
  • 就在今天凌晨,Spring Boot 3.2正式發佈了!該版本是在Java 21正式發佈之後的重要支持版本,所以在該版本中包含大量對Java 21支持的優化。 下麵,我們分別通過Spring官方發佈的博文和Josh Long長達80+分鐘的介紹視頻,一起認識一下Spring Boot 3.2最新版本 ...
  • 作者:敲敲敲敲暴你腦袋 鏈接:https://juejin.cn/post/7290758270577557539 一入國企深似海,捆綁越多,你走得越難,有的人甚至終身被困於此,任人搓揉捏扁。離職就要走得乾脆點,不要回頭,通常更煩的事情可能還在後頭,早走早解脫! 1.國企怎樣的? 有人說進國企,基本 ...
  • 在深度學習中,PyTorch和NumPy是兩個常用的工具,用於處理和轉換數據。PyTorch是一個基於Python的科學計算庫,用於構建神經網路和深度學習模型。NumPy是一個用於科學計算的Python庫,提供了一個強大的多維數組對象和用於處理這些數組的函數。 在深度學習中,通常需要將數據從NumP ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...