Python【day 18】面向對象-類和類的關係

来源:https://www.cnblogs.com/wangtp/archive/2019/12/17/12052405.html
-Advertisement-
Play Games

一、昨日內容回顧 成員 1、變數 1、成員變數--最常見 1、寫法: 變數前面加了self就是成員變數 這裡的self表示當前對象 一般是在構造方法中定義 2、調用: 對象.成員變數 3、作用: 可以在類中的不同方法間使用 有點局部的意思(每個對象的成員變數可以不同) 2、類變數(靜態變數) 1、寫... ...


一、昨日內容回顧
成員
1、變數
    1、成員變數--最常見
        1、寫法:
            變數前面加了self就是成員變數
            這裡的self表示當前對象
            一般是在構造方法中定義
        2、調用:
            對象.成員變數
        3、作用:
            可以在類中的不同方法間使用
            有點局部的意思(每個對象的成員變數可以不同)

    2、類變數(靜態變數)
        1、寫法
            寫在類中,方法外的變數
        2、調用
            類名.類變數
        3、作用
            全局的意思

    註意點:
    1、如果用對象.類變數,就相當於給對象新增了一個和類變數同名的成員變數
       原來的類變數不會有任何變化

2、方法
    1、成員方法--最常見
        1、範圍:
            構造方法:
                創建對象的時候,自動調用構造方法
            普通方法
        2、寫法:
            1、第一個參數是self,表示當前對象本身
        3、調用
            對象.成員方法
            內部原理:類名.成員方法(對象名)

    2、靜態方法
        1、寫法
            1、方法上面加上@staticmethod
            2、參數沒有self
        2、調用
            類名.靜態方法
        3、作用
            把靜態方法理解成類中的函數就可以

    3、類方法
        1、寫法
            1、類方法名字上面加上@classmethod
            2、第一個參數是cls
        2、調用
            類名.類方法
        3、作用
            用於在類中創建對象,設計模式

3、屬性
    1、概念
            通過方法的形式來表示一個屬性信息(變數-名稱)
    2、引入原因-由來
        1、成員變數或者資料庫欄位一般不保存人的年齡,而是保存人的生日
        2、因為年齡的話,每年都會變化,生日是不會變化的,易於維護
        3、根據出生日期計算年齡,做成一個成員方法的,但是年齡是一個名詞屬性
           用方法-動作來計算,稍有點不妥
        4、於是,就引入了屬性
    3、寫法
        1、成員方法的定義上面加上一行@property
    4、調用
        對象名.屬性名--調屬性
        對象名.方法名()--調成員方法

4、私有
    1、私有變數
        1、寫法
            類中,變數名字前面加上雙下劃線__
        2、調用
            1、不能用對象進行調用
            2、可以在類中的成員方法中使用
        3、對象如何間接調用私有變數
            1、把私有變數寫在類中的成員方法中
            2、對象通過調成員方法,從而間接調用私有變數

    2、私有方法
        1、寫法
            類中,成員方法名字前面加上雙下劃線__
        2、調用
            1、不能用對象進行調用
            2、可以在類中的成員方法中使用
        3、對象如何間接調私有方法
            1、把私有方法的調用,寫在類中的成員方法中
            2、對象通過調成員方法,從而間接調用私有方法

    3、註意點:
        1、子類繼承父類的時候,無法繼承父類的私有變數和私有方法

二、今日主要內容
    1、依賴關係
        1、比較輕的關係
        2、例子:
            大象裝冰箱
            大象裝高壓鍋--多態
            你打車
        3、寫法
            1、類2的對象作為參數傳入到類1的成員方法中
            2、在類1的成員方法中,通過類2的對象調類2的成員方法

    2、關聯關係(組合、聚合)
        1、一對一
            1、例子:男女朋友
            2、寫法
                1、類2的對象作為參數傳入到類1的成員方法中
                2、在類1的成員方法體中,把類2的對象賦值給類1的成員變數
                3、類1的成員變數就可以指代類2的對象了
                4、可以通過類1的成員變數調類2的成員變數,或者類2的成員方法

        2、一對多
            1、例子:學校和老師
            2、寫法
                類1-學校類的定義
                1、類1-學校類中定義一個成員變數,賦值空列表
                2、把類2的對象作為參數傳入到類1的成員方法1中
                3、在類1的成員方法體中,把類2的對象添加到空列表
                4、在類1的成員方法2中,迴圈遍歷這個列表,列表的每個元素就是類2的對象
                   通過類2的對象調類2的成員變數

                類1的成員方法調用
                1、類1的對象每調用一次成員方法1,就新增加一個老師對象到列表中

    3、繼承關係,實現關係
        1、self:當前執行這個方法的對象
        2、子類繼承父類
            1、新建的是子類對象,那麼self就是子類對象
            2、新建的是父類對象,那麼self就是父類對象

    4、特殊成員
        1、重點是:
            __str__()  #列印對象,預設是列印對象的記憶體地址;
                         重寫__str__()後,列印對象的時候,可以列印對象的成員變數
                         例子:
                            def __str__(self):
                                # return self.name,self.age,self.hobby #報錯
                                # TypeError: __str__ returned non-string (type tuple)
                                # 返回值必須是字元串,而不能是元組
                                return '%s %s %s' % (self.name,self.age,self.hobby)

            __new__()  #創建對象的過程
                1、載入類
                      calss 類名 定義類

                2、開闢記憶體空間
                        __new__(cls)方法,此時記憶體空間沒有對象,需要下一步創建

                3、創建對象
                        通過__new__(cls)的返回值
                        return object.__new__(cls)  來創建對象
                        註意點:這裡參數是cls類,而不是self對象,因為此時只有類,對象還沒有被創建出來

                4、初始化對象
                        構造方法 __init__()

                5、使用對象
                        對象調成員變數,或者對象調成員方法


        2、常見特殊成員
            1、__init__() 構造方法

            2、__hash__()
                類和對象預設是可哈希的,不可變,可以作為字典的key
                __hash__ = None  #就變成不可哈希,可變的,不能作為字典的key

            3、__getitem__(value)
                對象[key]就是調用__getitem__(value)方法,參數是value
                通過key獲取value,類似字典

            4、__setitem__()
                對象[key] = value 就是調用__setitem__(key,value)方法,參數是key,value
                添加鍵值對,類似字典

            5、__delitem__(key)
                del 對象[key]就是調用__delitem__(key)方法,參數是key
                通過key刪除鍵值對,類似字典

            6、__enter__()
                  return 字元串
            7、__exit__()
            with 對象 as 變數:
                pass
                print(變數)
            過程如下:
                1、先調__enter__()方法進入
                2、其返回值,被with後面的變數接收
                3、再調__exit__()方法退出
            例子:打開文件
一、依賴關係
需求:要把大象裝冰箱
偽代碼思路:
1、新建2個類,大象類和冰箱類
2、關係:大象類要依賴冰箱類
3、大象類--成員方法:
    1、開冰箱門--依賴冰箱類--傳入冰箱對象
    2、裝自己
    3、關冰箱門--依賴冰箱類
4、冰箱類--成員方法:
    1、開門
    2、關門

需求2:要把大象裝高壓鍋  -這裡的冰箱和高壓鍋  多態
偽代碼思路:
1、新建2個類,大象類和高壓鍋類
2、關係:大象類要依賴高壓鍋類
3、大象類--成員方法:
    1、開高壓鍋門--依賴高壓鍋類--傳入高壓鍋對象
    2、裝自己
    3、關高壓鍋門--依賴高壓鍋類
4、高壓鍋類--成員方法:
    1、開門
    2、關門

小結:
1、依賴是一種松耦合的關係
    大象開冰箱門,冰箱壞了,大象還可以開高壓鍋門
2、多態思想
    大象開冰箱門,開高壓鍋門  冰箱和高壓鍋對象就是多態
3、依賴的寫法
    1、類a依賴類b
       大象類依賴冰箱類
    2、類a的成員方法,形參是類b的對象
       類a的成員方法的內容: 類b的對象.類b的成員方法()
4、依賴的概念
    在方法中引入另一個類的對象
5、沒有特指
    大象開冰箱門,想要的對象是一個冰箱-泛指,
        具體是哪個冰箱(是那台haier冰箱,還是這台美的冰箱)沒有指定--沒有特指(這台還是那台)
關聯關係:一對一
1、在類1的成員方法中,把類2的對象作為形式參數,傳遞給類1的成員變數
    self.類1的成員變數 = 類2的對象
    左邊就可以等價於右邊(即類2的對象的地方,可以用類1的對象.成員變數表示

依賴關係和關係關係的區別
一、寫法不同:
1、前者
    在類1的成員方法中,把類2的對象作為形式參數
    寫法:
    類1的成員方法(類2的對象):  #這裡類2的對象可以是冰箱,也可以是高壓鍋,多態
        類2的對象.類2的成員方法()
2、後者
    在類1的成員方法中,把類2的對象作為形式參數,傳遞給類1的成員變數
    寫法:
    類1的成員方法(類2的對象):
        self.成員變數=類2的對象
    說明:後面凡是用到類2對象的地方,可以用類1對象.成員變數代替

二、例子
1、前者的例子是大象裝冰箱,打車(今天打這個車,明天打那個車)
                     --(類比:關係比較輕,大象可以裝不同的冰箱,你可以打不同的車)
   後者的例子是男女朋友--(類比:關係更緊密)
關聯關係中一對一和一對多的區別

一、寫法不同
1、前者
    男孩類的成員方法
        def meet(self,girl):  #參數是女孩對象  女孩對象傳遞給男孩的女朋友這個成員變數
            self.girl_friend = girl  #關鍵點
            #男孩對象的成員變數-girl_friend就是女孩對象

2、後者
    學校類的構造方法
        self.__techer_list = []
    學校類的成員方法
        def recruit(self,t):  #招聘-成員方法  參數t是老師對象
            self.__techer_list.append(t)

二、例子不同
1、前者的例子是男女朋友
2、後者的例子是學校和老師

擴展:
組合關係、聚合關係和關聯關係的寫法是類似的
四、特殊成員
特殊成員
1、寫法
   雙下劃線開頭,雙下劃線結尾的方法
2、作用
    特殊場景下,會自動執行
3、例子
    __init__()

一、構造方法
   1、創建對象的時候,會自動執行構造方法 __init__()

二、__call__()方法
    1、用法
        新建對象(),就會自動調用__call__()方法
    2、對象後面加小括弧  對象()是python特有的

三、__getitem__()方法
    1、用法
        對象名[key],就會自動調用__getitem__(key)方法
        參數就是key
    2、類似字典,可以從對象中獲取key

四、__setitem__()方法
    1、用法
        對象名[key]=value,就會自動調用__setitem__(key,value)方法
        參數是key,value
    2、類似字典,相當於給對象添加一個鍵值對

五、__delitem__()方法
    1、用法
        del 對象名[key],就會自動調用__delitem__(key)方法
        參數是key
    2、類似字典,相當於給對象刪除一個鍵值對

六、__enter__()方法
        return var1
    __exit__()方法
    with 對象 as 變數:
        print var1   #這裡的var1是__enter__方法的返回值
    1、說明:
        with的執行過程
        1、先執行__enter__方法
        2、再執行with中的代碼塊
        3、最後執行__exit__方法

七、__hash__()方法
    1、類名和對象名預設都是可哈希的,不可變的,可以作為字典的key
       原因是:萬事萬物都是對象,類名是object的子類
              object這個類中有__hash__()方法
              這個方法的存在,就表示可以哈希
    2、__hash__ = None
       在類中加上上面一行,類名就不可哈希,可變的,不能作為字典的key
       註意點:這裡是 =賦值 而不是==值的判斷

八、__str__() 方法
    1、__str__() 方法是Boy的父類object的方法,如果子類不重寫的話
       列印對象,就是列印對象的記憶體地址
    2、子類重寫__str__() 方法後
        再次列印對象,就可以不輸出對象的記憶體地址,而是自定義輸出了
    3、註意點:
        __str__() 方法的返回值的類型必須是字元串,而不能是元組,否則會報錯

九、__new__(cls)方法
    創建對象的步驟
    1、載入類
    2、開闢記憶體空間:通過__new__(cls)方法
    3、創建對象:    通過__new__(cls)方法的返回值
                     object.__new__(cls)來創建對象
                     註意點:__new__()的參數是cls類,而不是對象(因為現在對象還沒有創建出來)
    4、初始化對象:
                    創建對象的過程中,自動調構造方法__init__(),初始化對象
                    把成員變數封裝到對象中,就是初始化對象
    5、使用對象:
                    1、列印對象
                    2、對象調成員方法
                    3、對象調成員變數

 


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

-Advertisement-
Play Games
更多相關文章
  • 1、vue初時 vue安裝三種方式: 1:CDN引入 以下推薦國外比較穩定的兩個 CDN,國內還沒發現哪一家比較好,目前還是建議下載到本地。 Staticfile CDN(國內) : https://cdn.staticfile.org/vue/2.2.2/vue.min.js unpkg:http ...
  • 模擬實現 Promise(小白版) 本篇來講講如何模擬實現一個 Promise 的基本功能,網上這類文章已經很多,本篇筆墨會比較多,因為想用自己的理解,用白話文來講講 Promise 的基本規範,參考了這篇: "【翻譯】Promises/A+規範" 但說實話,太多的專業術語,以及基本按照標準規範格式 ...
  • JSP: <%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html><head> <lin ...
  • 導讀 在spring中委派模式用的比較多,在常用的23種設計模式中其實是沒有委派模式的影子的。 在spring中體現:Spring MVC框架中的DispatcherServlet其實就用到了委派模式。 委派模式的作用:基本作用就是負責任務的調用和分配,跟代理模式很像,可以看做是一種特殊情況下的靜態 ...
  • 好的設計不是免費的。它必須是你不斷投資的東西,這樣小問題就不會積累成大問題。 幸運的是,好的設計最終會收回成本,而且比你想象的要快。 ...
  • 2020年必讀書籍推薦:軟體設計的哲學(A Philosophy of Software Design),本書190多頁,豆瓣的點評分在9分以上,目前只有英文版本,中文版還未上市,英文好的同學建議去直接閱讀原版。 ...
  • springboot開發微服務框架一般使用springcloud全家桶,而整個項目都是容器化的,通過k8s進行編排,而k8s自己也有服務發現機制,所以我們也可以拋棄springcloud里的eureka,而直接使用k8s自己的服務。 添加組件 註意點 1. application.name與k8s的 ...
  • 馬蜂窩技術原創文章,更多乾貨請搜索公眾號:mfwtech ​即時通訊(IM)功能對於電商平臺來說非常重要,特別是旅游電商。 從商品複雜性來看,一個旅游商品可能會包括用戶在未來一段時間的衣、食、住、行等方方面面;從消費金額來看,往往單次消費額度較大;對目的地的陌生、在行程中可能的問題,這些因素使用戶在 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...