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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...