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
  • 示例項目結構 在 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# ...