Python面向對象之類屬性類方法靜態方法

来源:https://www.cnblogs.com/yifchan/archive/2019/05/06/python-1-17.html
-Advertisement-
Play Games

Python面向對象之類屬性類方法靜態方法,內容包括 類的結構,類屬性和實例屬性,類方法和靜態方法,方法綜合案例等。其中,類的結構 包括 實例,類是一個特殊的對象;類屬性和實例屬性 包括 類屬性的定義及使用,屬性的查找機制-向上查找;類方法和靜態方法 包括 類方法,靜態方法;方法綜合案例 僅包含 游... ...


類的結構

實例

使用面向對象開發時,第一步是設計類;
當使用 類名() 創建對象時,會自動執行以下操作:
1.為對象在記憶體中分配空間--創建對象;
2.為對象的屬性 設置初始值--初始化方法(init);
對象創建後,記憶體中就有了一個對象的實實在在的存在--實例

因此通常也會把:
1.創建出來的對象叫做類的實例;
2.創建對象的動作叫實例化;
3.對象的屬性叫實例屬性;
4.對象調用的方法叫實例方法;

在程式執行時:
1.對象各自擁有自己的實例屬性;
2.調用對象方法,可以通過self. 訪問自己的屬性/調用自己的方法;

結論:
1.每一個對象都有自己的記憶體空間,保存各自不同的屬性;
2.多個對象的方法,在記憶體中只有一份,在調用方法的時候,需要把對象的引用傳遞到方法內部;

類是一個特殊的對象

Python中,一切皆對象:

class AAA: 定義的類屬於類對象;
obj1 = AAA() 屬於實例對象;
  • 程式運行時,類同樣會被載入到記憶體中;
  • 在Python中,類是一個特殊的對象--類對象;
  • 在程式運行時,類對象在記憶體中只有一個,使用一個類可以創建出很多對象實例;
  • 除了封裝實例的屬性和方法外,類對象還可以擁有自己的屬性和方法--類屬性;類方法;
  • 通過類名. 的方式可以訪問類的屬性或者調用類的方法;

代碼分層為:
1.類屬性
2.類方法(cls)
3.__init__定義實例屬性
4.實例方法(self)

類屬性和實例屬性

類屬性的定義及使用

類屬性就是給類對象定義的屬性;
通常用來記錄與這個類相關的特征;
類屬性不會用於記錄具體對象的特征;

定義一個植物類,每新添一種植物就讓植物類計數+1

class Plant(object):
    # 使用賦值語句定義類屬性,記錄所有植物對象的數量
    count = 0

    def __init__(self, name):
        self.name = name
        # 每初始化一次,就讓類屬性的值+1
        Plant.count += 1


# 創建植物對象
duorou = Plant("多肉")
print("目前已養植物種類數量:", Plant.count)  
# 目前已養植物種類數量: 1

luhui = Plant("蘆薈")
yingtao = Plant("櫻桃")
# 輸出植物對象的總數
print("目前已養植物種類數量:", Plant.count)  
# 目前已養植物種類數量: 3

屬性的查找機制-向上查找

在python中 屬性的獲取存在一個向上查找機制:
1.首先在對象內部查找對象屬性;
2.沒有找到就會向上查找類屬性;

因此,要訪問類屬性有兩種方式
1.類名.類屬性
2.對象.類屬性(不推薦)

註意:如果使用 對象.類屬性=值 賦值語句,只會給對象添加一個屬性,而不會影響到類屬性的值;

可以用 對象.類屬性 查看類屬性,但不能用 對象.類屬性=值 給它賦值;
如果使用 對象.類屬性=值 賦值語句,只會給對象添加一個屬性,而不會影響到類屬性的值;

類方法和靜態方法

類方法

類方法概念和定義語法

類屬性 就是針對類對象定義的屬性;
使用賦值語句在關鍵字class下麵可以定義類屬性;
類屬性用來記錄與這個類相關的特征;

類方法 就是針對類對象定義的方法;
在類方法內部可以直接調用類屬性或者其他的類方法;

類方法定義語法如下:

@classmethod
def 類方法名(cls):
    pass

類方法需要@classmethod來進行修飾,告訴解釋器這是一個類方法;
類方法的第一個參數應該是cls;
由哪一個類調用的類方法,方法內部的cls就是哪一個類的引用;
這個參數和實例方法的第一個參數是self類似;
使用其他名稱也可以,但一般習慣使用cls;
通過 類名. 調用類方法,調用類方法時,不需要傳遞cls參數;
在方法內部,
可以通過 cls. 調用類屬性;
通過 cls. 也可以調用其他類的方法;
在類方法內部可以直接使用cls 訪問類屬性或者其他的類方法;

類方法案例演示

class Plant(object):
    # 使用賦值語句定義類屬性,記錄所有植物對象的數量
    count = 0

    # 定義一個類方法
    @classmethod
    def show_count(cls):
        print("目前已養植物種類數量:", Plant.count)

    def __init__(self, name):
        self.name = name
        Plant.count += 1


duorou = Plant("多肉")
luhui = Plant("蘆薈")

# 調用類方法
Plant.show_count()  # 目前已養植物種類數量: 2

靜態方法

靜態方法概念和語法

在開發時,如果需要在類中定義一個方法,這個方法:
既不需要訪問實例屬性也不需要調用實例方法;
既不需要訪問類屬性也不需要調用類方法;
這個時候,就可以把這個方法封裝成靜態方法;

靜態方法語法如下:
@staticmethod
def 靜態方法名():
pass

靜態方法需要修飾器 @staticmethod 來表示,告訴解釋器這是一個靜態方法;
通過 類名. 調用靜態方法;

靜態方法示例

class Dog(object):
    @staticmethod
    def run():
        # 不需要訪問類屬性和實例屬性的方法,就可以定義一個靜態方法
        print("跳著跑")

    def __init__(self, name):
        self.name = name

    def bark(self):
        pass


# 通過 類名. 調用靜態方法,不需要創建對象
Dog.run()

方法綜合案例

案例需求
1.設計一個Game類
2.屬性:
定義一個類屬性top_score記錄游戲最高分
定義一個實例屬性palyer記錄游戲玩家名字
3.方法:
靜態方法show_help查看游戲幫助信息;
類方法show_topscore顯示游戲最高分;
實例方法start_game開始當前玩家的游戲
4.主程式步驟
查看幫助信息
查看歷史最高分
創建游戲對象,開始游戲

案例分析
歷史最高成績--類屬性
玩家姓名--實例屬性

顯示玩法--靜態方法
顯示歷史最高成績--類方法
進入游戲--實例方法

綜合案例演練
同時使用類屬性,實例屬性,靜態方法,類方法,實例方法;

class Game(object):
    top_score = 0
    @staticmethod
    def game_help():
        print("游戲幫助信息")
    @classmethod
    def show_topscore(cls):
        print("歷史最高分數是:", cls.top_score)

    def __init__(self, name):
        self.name = name

    def play_game(self):
        print("%s 開始游戲了" % self.name)


# 查看游戲幫助文檔
Game.game_help()
# 查看歷史最高分
Game.show_topscore()
# 創建游戲對象
xiaoming = Game("小明")
# 進入游戲
xiaoming.play_game()

# 游戲幫助信息
# 歷史最高分數是: 0
# 小明 開始游戲了

案例小結
1.實例方法--方法內部需要訪問實例屬性;方法內部可以使用 類名. 查看類屬性;
2.類方法--方法內部只需要訪問類屬性;
3.靜態方法--方法內部既不需要訪問類屬性也不需要訪問靜態屬性;
提示:當一個方法內急需要訪問實例屬性也需要訪問類屬性時,應該使用示例方法;因為類只有一個,實例方法內部可以使用 類名. 查看類屬性;


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

-Advertisement-
Play Games
更多相關文章
  • 這篇我們學習的是單例模式,相信很多朋友都或多或少使用過這個模式。很多設計模式的入門,都把單例模式作為第一個的,但是因為我們是跟著書本學習,所以放在了第五個裡面。那麼,你使用過的單例模式是怎麼樣的呢?懶漢式?餓漢式?雙重校驗?靜態? 先來看下定義,單例模式(Singleton Pattern): 用來 ...
  • 命名的註意事項: 命名要有實際含義 命名風格保持一致 不用拼音命名 不用語言關鍵字 適當的使用註釋 好的代碼應該是自描述的 難以理解的地方加上註釋 函數的功能加上註釋說明 類的功能和使用方法加註釋 多備份重要的代碼 代碼不能只有一份 啟用編譯器的自動備份 用代碼管理工具備份 堅持字元編碼統一 PHP ...
  • 1. 在開發機上的準備工作 2. 在伺服器上的準備工作 3.安裝uwsgi 4.編寫uwsgi配置文件,使用配置文件啟動uwsgi 5. 安裝nginx 6. 收集靜態文件 7. 編寫nginx配置文件: 8. 使用supervisor配置 1. 在開發機上的準備工作 git init git re ...
  • 01、Lombok 的自我介紹 Lombok 在官網是這樣作自我介紹的: Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boil ...
  • Python編程實現對視頻文件進行剪切的功能。截取指定長度的視頻並保存,運行後首先選擇要裁剪的視頻,然後輸入開始時間點和停止時間點即可。將剪切後的視頻保存為output.avi文件 Python編程實現對視頻文件進行剪切的功能。截取指定長度的視頻並保存,運行後首先選擇要裁剪的視頻,然後輸入開始時間點 ...
  • 第一次編輯 2019-05-07 01:09:39 垃圾回收的對象 程式中的不可用對象(不存活的對象,沒有任何引用),或者無用的變數信息等,在程式中長期存在會逐漸占用較多的記憶體空間,導致沒有足夠的空間分配給新生成的對象等. 判斷哪些是需要回收的對象 早期jdk使用引用計數法,計數每個對象的引用次數, ...
  • 什麼是原子操作? 原子操作和資料庫的ACID有啥關係? AtomicInteger是怎麼實現原子操作的? AtomicInteger是有什麼缺點? ...
  • Python基礎之單例模式,內容包括 單例設計模式介紹,__new__方法,Python中的單例。其中,單例設計模式 包括 設計模式,單例模式;__new__方法 包括 __new__作用,重寫__new__方法註意,重寫new方法示例;Python中的單例 包括 單例,單例設計模式思路分析,用ne... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...