IT黑馬-面向對象

来源:https://www.cnblogs.com/srnl/archive/2019/10/26/11746187.html
-Advertisement-
Play Games

先說面向過程 面向過程主要考慮的是怎麼做 把完成摸個需求的 所有步驟 從頭到尾 逐步實現 根據開發需求,將某些功能獨立的代碼封裝成一個又一個的函數 最後完成的代碼就是順序的調用不同的函數. 特點是: 註重不准走與過程,不註重職責分工. 如果需求複雜,代碼會變的很複雜 開發複雜項目,沒有固定套路,開發 ...


先說面向過程

面向過程主要考慮的是怎麼做
把完成摸個需求的 所有步驟 從頭到尾 逐步實現
根據開發需求,將某些功能獨立的代碼封裝成一個又一個的函數
最後完成的代碼就是順序的調用不同的函數.
特點是:
註重不准走與過程,不註重職責分工.
如果需求複雜,代碼會變的很複雜

開發複雜項目,沒有固定套路,開發難度很大.

面向對象

側重點是誰來做?
相比較函數,面向對象是更大的封裝,根據職責在一個對象中封裝多個方法.
在完成某偶一個需求前首先確定職責--要做的事情(方法)
根據職責確定不同的對象,在對象內部封裝不同的方法(多個)
最後完成的代碼就是順序的讓不同對象調用不同的方法.
特點是:
註重對象和職責,不同的對象承擔不同的職責
更加適合對應複雜的需求變化,最專門應對複雜項目開發,提供固定套路
需要面向過程的基礎上,再學習一些面向對象的語法.
例子:

image.png

類和對象是面向對象編程的兩個核心概念
類是對一群具有相同特征或者行為的實物的一個統稱,是抽象的,不能直接使用
特征被稱為 屬性
行為被稱為 方法
對象 是由類創建出來的一個具體存在,可以直接使用
由哪一個類創建出來的對象 就擁有在哪一個類中定義的 屬性和方法
類相當於圖紙,對象就是用圖紙創造出來的東西
在程式開發中先有類,再有對象.
類和對象的關係:
類是模板,對象是根據類這個模板創建出來的.
類只有一個,而對象可以有很多個.
不同的對象之間屬性可能會各不相同.

類中定義了什麼 屬性和方法,對象中就有什麼屬性和方法,不可能多也不可能少.

類的設計

在使用面向對象開發前應該啥偶先分析需求,確定一下,程式中需要包含哪些類!
在程式開發中藥設計一個類,通常需要滿足以下三個要素.:

  1. 類名,這類事物的 名字 ,滿足大駝峰命名法(每個單詞的首字母大寫,單詞與單詞之間沒有下劃線)
  2. 屬性,這類事物具有什麼樣的特征
  3. 方法,這類事物具有什麼樣的行為.

類名的確定

名詞提煉法:分析整個業務流程,出現的 名詞,通常就是要找到的類.

屬性和方法的確定

  • 對對象的特征描述, 通常可以定義成屬性.
  • 對對象具有的行為(動詞),通常可以定義成方法.
    提示:需求中沒有涉及的屬性或方法在涉及類時,不需要考慮.

基礎語法

dir內置函數

  • 在python中對象是無所不在的,變數,數據,函數都是對象
    在python中可以使用兩個方法驗證:
  1. 在標識符/數據後輸入一個.. 然後按下tab ipython會提示改對象能夠調用的方法列表.
  2. 使用內置的dir傳入標識符/數據/可以查看對象內所有屬性及方法:dir(print)
  3. dir後可以看到 __doc__ 方法 這是定義類時候的說明.
    4.提示 __方法名__格式的方法是python提供的內置方法/屬性,:
    4.1 __new__ 創建對象時候會被自動調用
    4.2 __init__ 對象被初始化時會自動調用
    4.3 __del__ 對象被從記憶體中銷毀前會自動調用
    4.4 __str__ 返回對象的描述信息,print函數輸出使用.

定義簡單的類(只包含方法)

  • 面向對象是更大的封裝,在一個類中封裝多個方法,這樣通過這個類創建出來的對象,就可以直接調用這些方法了!
  1. 定義只包含方法的類
class 類名:
  def 方法1(self, 參數列表):
    pass
  def 方法2(self, 參數列表):
    pass
  • 方法的定義格式和之前學習的函數幾乎一樣
  • 區別在於第一個參數必須是self
    *註意類名命名規則要符合大駝峰命名法.
    2.創建對象
  • 當一個類 定義完成之後,要使用這個類來創建對象語法如下
對象變數 = 類名()

第一個面向對象的演練

  1. 需求分析(很重要)
  • 小貓愛吃魚, 小貓要喝水
    1.1 定義一個貓類 Cat
    1.2 定義兩個方法 eat 和 dirnk
    2.代碼:
class Cat():
  def eat(self):
    print('吃魚吃魚')
  def drink(self):
    print('喝水喝水')
#開始調用
tom = Cat()
tom.eat()
tom.drink()

引用概念的強調

在面向對象開發中,引用概念是同樣適用的!
解釋器先執行等號右邊的內容 在記憶體中創建了一個對象
然後在讓tom這個變數引用這個對象的記憶體地址.

  • 在python中使用類創建對象後,tom變數中仍然記錄的是對象在記憶體中的地址.
  • 也就是tom變數引用了新建的貓對象
  • 使用print輸出對象變數.預設情況下是能夠輸出這個變數應用的對象是由哪一個類創建的對象,以及在記憶體中的地址(十六進位表示.)

在電腦中通常使用十六進位表示記憶體地址
%d 可以以10進位輸出數字
%x 可以以16進位輸出數字
應用id函數
addr = id(tom)
print("%d" % addr) # %x可以看到16進位.


再創建多個對象

lazy_cat = Cat()
lazy_cat.eat()
lazy_cat.drink()

這兩個貓對象 不是同一個對象,查看其記憶體地址就可以知道了.
但是如果我們用另外一個變數去接收lazy_cat 例如
mao1 = lazy_cat

這樣mao1 和lazy_cat就是一樣的了 只是變數名字的變化

在類的外部給類增加屬性(不要用,會報錯!)

  • 在python中,要在對象外設置屬性,非常容易 但是不推薦使用,因為對象屬性的封裝應該封裝在類的內部
  • 只需要在類的外部的代碼中直接通過.設置一個屬性即可
huamao.name  = '花貓'
# 調用
huamao.name

利用self在類封裝的方法中輸出對象屬性

class Cat:
  def eat(self):
    print("%s 愛吃魚" % self.name)
# 測試
mao1  = Cat()
mao1.name = '湯姆'
mao1.eat()
  • self 就是記錄這個對象本身的,可以知道具體操作的那個對象.
  • 哪一個對象調用的方法,self就是那個對象的應用.
  • 在方法內部 想要使用那個屬性,就用self.屬性名 就可以了
  • 在類封裝方法內部 self 就表示當前調用方法的對象自己
  • 在方法內部可以通過self.訪問對象的屬性,也可以通過self.調用其他對象的方法.

初始化方法

  • 當使用類名()創建對象時,會自動執行以下操作:
    1. 為對象在記憶體中分配空間 --創建對象
    2. 為對象的屬性設置初始值 --初始化方法(init)
  • 這個初始化方法就是__init__方法,__init__方法是對象的內置方法.

__init__方法是專門用來定義一個雷具有哪些屬性的放方法
在cat中增加 __init__方法,驗證該方法在創建對象時會被自動調用

class Cat:
  '''這是一個貓類'''
  def __init__(self):
    print("初始化方法")
  • 在`__init__方法內部使用 `self.屬性名 = 屬性值 就可以定義屬性.
  • 定義屬性之後再使用Cat類創建對象 都會擁有該屬性.
# 重構Cat類
class Cat:
  def __init__(self):
    print('這是一個初始化方法')
    self.name = 'Tom'
  def eat(self):
      print("%s愛吃魚" % self.name)
# 調用
tom = Cat()
tom.eat()
print(tom.name)

改造初始化方法 --舒適化的同時設置初始值

  • 在開發中,如果希望在創建對象的同時就設置對象的屬性,可以對__init__進行改造
  1. 把希望設置的屬性值,定義成__init__方法的參數
  2. 在方法內部使用self.屬性 = 形參接受外部傳遞的參數
  3. 在創建對象時,使用類名(屬性1,屬性2)調用
    例子:
class Cat:
  def __init__(self, name):
    print("初始化方法 %s"% name)
    self.name = name
# 調用
tom = Cat('Tom')

__del____str__方法

  • 當時用類名創建對象時 分配完空間後,自動調用__init__方法但是當一個對象被從記憶體中銷毀前會自動調用__del__方法.

*生命周期

  1. 一個對象從調用類名()創建,生命周期開始.
  2. 一個對象的__del__方法一旦被調用,生命周期結束
  3. 在對象的生命周期內,可以訪問對象屬性,或者讓對象調用方法
    image.png
  • 在python中,使用print輸出對象變數,預設情況下會輸出這個變數應用的對象使用哪一個類創建的對象,以及記憶體中管道地址.
  • 在開發中 希望使用print 輸出對象變數時,能夠列印自定義的內容,就可以利用__str__這個內置方法付了.
  • 註意 __str__方法必須返回一個字元串
class Cat:
  def __init__(self, new_name):
    self.name = new_name
    print(self.name +'你好')
  def __del__(self):
    print(self.name+'走了')
  def __str__(self):
    return '這是__str__'

面向對象練習.

目標: 封裝 小明愛跑步 存放傢具

  1. 封裝
    1.1 封裝是面向對象編程的一大特點
    1.2 面向對象編程的第一步 將屬性和方法封裝到一個抽象的類中.
    1.3 外界使用類創建對象,然後讓對象調用方法
    1.4 對象方法的細節都被封裝在類的內部
  2. 小明愛跑步.
    2.1 小明體重 75.0公斤
    2.2 小明每次跑步會減肥0.5公斤
    2.3 吃東西體重增加1公斤.
    image.png
  • 在對象的方法內部,是可以直接訪問對象的屬性的.

中間部分略過,以後補

私有屬性和方法

應用場景和定義

  • 在實際開發中,對象的某些屬性或方法可能只希望在對象的內部被使用,而不希望在外部被訪問到
  • 私有屬性就是對象不希望公開的屬性
  • 私有方法就是對象不希望公開的方法

定義方式

  • 在定義屬性或方法時,在屬性名或者方法名前面增加兩個下劃線,定義就是私有屬性或方法.
    例子:
class Women:

  def __init__(self, name):

    self.name = name 
    self.__age = 18
   def secret(self):
    print("%s 的年齡是 %d "%(self.name, self.__age))
# 測試
xiaofang = Women("小芳")
print(xiaofang.__age)  # 這個就調用不了了.私有屬性 在外界不能被直接訪問.
xiaofang.secret()  # 但是在對象的方法內部可以訪問.
方法同理 不希望外界調用的方法前面加`__`,外部就調用不了了,只可以在類的內部調用.

偽私有屬性和方法

在日常開發中不要使用這種方式,訪問隊形的私有屬性或私有方法.

  • 在python,並沒有真正意義的私有
  • 加了__實際只是python做了一些特殊處理
  • 具體方式為:在在名稱前面加上 _類名__名稱
    例子:
    print(xiaofang._Women__age)

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

-Advertisement-
Play Games
更多相關文章
  • 異常處理是 Java 開發中的一個重要部分,是為了處理任何錯誤狀況,比如資源不可訪問,非法輸入,空輸入等等。Java 提供了幾個異常處理特性,以try,catch 和 finally 關鍵字的形式內建於語言自身之中。Java 編程語言也允許創建新的自定義異常,並通過使用 throw 和 throws ...
  • “其實地上本沒有路,走的人多了,也便成了路”——魯迅《故鄉》 這句話很好的描述了設計模式的由來。前輩們通過實踐和總結,將優秀的編程思想沉澱成設計模式,為開發者提供瞭解決問題的思路。除此之外,設計模式還是開發者之間溝通的橋梁,是程式員的語言,比如我說這段代碼用的是單例模式,你就知道它的基本實現和用法。 ...
  • 1、Java 反射技術 Java反射技術應用廣泛,它能夠配置:類的全限定名、方法和參數,完成對象的初始化,甚至是反射某些方法。這樣可以大大增強Java的可配置性,如Spring IoC 的基本原理也是反射,當然Spring IoC 的代碼要復炸得多,還有其他的技術結合。 Java 的反射內容繁多, ...
  • 2019-10-26-22:40:09 目錄: 1.多態的概念 2.多態的分類 3.實現多態的三個必要條件 4.多態的格式 5.多態成員變數的使用特點 6.多態成員方法的使用特點 7.多態的好處 8.多態的向上和向下轉型 1.多態的概念: 多態性是面向對象編程的又一個重要特征,它是指在父類中定義的屬 ...
  • 一、Java語言中假設一個類沒有顯式的繼承任何類,那麼該類預設繼承Java SE庫中提供的java.lang.Object類 1.快捷鍵:Ctrl + shift + T:可以在Myeclipse中查找類 2.快捷鍵:Ctrl + shift + R:可以在Myeclipse中查找資源 繼承類舉例: ...
  • title: 【學習】深入理解JVM之類載入.mddate: 2019-10-20 22:20:06tags: JVM 類載入 Java類的載入,連接,初始化都是在程式運行期間執行的 ## Java 虛擬機與程式的生命周期 1. 執行 System.exit()方法2. 程式正常結束3. 遇到異常或 ...
  • 解決方案:IntelliJ IDEA安裝lombok插件可以解決以上問題 。步驟:1.找到IDEA 上方的菜單欄 點擊File =>Settings,或者按快捷鍵Ctrl+Alt+S。 2.如圖所示,搜索Plugins 3.在彈出的框中,找到如圖相應的插件,點擊安裝,重新啟動即可解決問題 原文鏈接: ...
  • 恢復內容開始 素描作為一種近乎完美的表現手法有其獨特的魅力,隨著數字技術的發展,素描早已不再是專業繪畫師的專利,今天這篇文章就來講一講如何使用python批量獲取小姐姐素描畫像。文章共分兩部分: 第一部分介紹兩種使用python生成素描畫的思路 第二部分介紹如何批量獲取素描畫 第一部分介紹兩種使用p ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...