Python類的成員

来源:https://www.cnblogs.com/wangyueping/archive/2019/06/30/11108437.html
-Advertisement-
Play Games

Python類的成員 一、細分類的組成成員 類大致分為兩大部分: 1. 靜態屬性 2. 動態方法 每個區域詳細劃分又可以分為: 二、類的私有成員 對於每一個類的成員而言都有兩種形式: 公有成員,在任何地方都能訪問 私有成員,只有在類的內部才能方法 私有成員和公有成員的訪問限制不同 : 靜態屬性 公有 ...


Python類的成員

一、細分類的組成成員

類大致分為兩大部分:

  1. 靜態屬性
  2. 動態方法
class A:
    # 靜態屬性部分
    name = "dogfa"
    age = 18
    
    # 動態方法部分
    def __init__(self, name, age):
        self.name = name
        self.age = age

每個區域詳細劃分又可以分為:

class A:
    name = "dogfa"  # 靜態屬性
    __age = 18      # 私有靜態屬性

    def __init__(self, name, gender):  # 雙下方法(內置方法)
        self.name = name               # 對象屬性
        self.__gender = gender         # 私有對象屬性

    def __func(self):       # 私有方法
        pass

    def func(self):         # 普通方法
        pass

    @classmethod
    def classfunc(cls):     # 類方法
        pass

    @staticmethod
    def staticfunc():       # 靜態方法
        pass

    @property
    def prop(self):         # 屬性
        pass

二、類的私有成員

對於每一個類的成員而言都有兩種形式:

  • 公有成員,在任何地方都能訪問
  • 私有成員,只有在類的內部才能方法

私有成員和公有成員的訪問限制不同

靜態屬性

  • 公有靜態屬性:類可以訪問;類內部可以訪問;派生類中可以訪問
  • 私有靜態屬性:僅類內部可以訪問;

對象屬性

  • 公有對象屬性:對象可以訪問;類內部可以訪問;派生類中可以訪問
  • 私有對象屬性:僅類內部可以訪問;

方法:

  • 公有方法:對象可以訪問;類內部可以訪問;派生類中可以訪問
  • 私有方法:僅類內部可以訪問;

總結:對於這些私有成員來說,他們只能在類的內部使用,不能再類的外部以及派生類中使用。

tips:非要訪問私有成員的話,可以通過 對象._類__屬性名,但是絕對不允許!!

為什麼可以通過._類__私有成員名訪問呢?因為類在創建時,如果遇到了私有成員它會將其保存在記憶體時自動在前面加上_類名。

三、類的其它成員

這裡的其他成員主要就是類方法:

方法包括:普通方法、靜態方法和類方法,三種方法在記憶體中都歸屬於類,區別在於調用方式不同。

實例方法

​ 定義:第一個參數必須是實例對象,該參數名一般約定為“self”,通過它來傳遞實例的屬性和方法(也可以傳類的屬性和方法);

​ 調用:只能由實例對象調用。

類方法

​ 定義:使用裝飾器@classmethod。第一個參數必須是當前類對象,該參數名一般約定為“cls”,通過它來傳遞類的屬性和方法(不能傳實例的屬性和方法);

​ 調用:實例對象和類對象都可以調用。

靜態方法

​ 定義:使用裝飾器@staticmethod。參數隨意,沒有“self”和“cls”參數,但是方法體中不能使用類或實例的任何屬性和方法;

​ 調用:實例對象和類對象都可以調用。

雙下方法

 定義:雙下方法是特殊方法,他是解釋器提供的由雙下劃線加方法名加雙下劃線 __方法名__的具有特殊意義的方法,比如__init__

 調用:不同的雙下方法有不同的觸發方式,就好比盜墓時觸發的機關一樣,不知不覺就觸發了雙下方法,例如:__init__

  1. 類方法

    應用場景:

    1. 類中有些方法是不需要對象參與

      class A:
          name = "dogfa"
          index = 0
      
          @classmethod
          def func(cls):
              return cls.name + str(cls.index)
      
      print(A.func())
    2. 對類中的靜態變數進行改變,要用類方法

      class A:
          name = "dogfa"
          index = 0
      
          @classmethod
          def func(cls, name):
              cls.name = name
              return cls.name
      
      print(A.func("oldniu"))
    3. 繼承中,父類得到子類的類空間,然後可以對子類為所欲為

      class A:
          name = "dogfa"
          index = 0
      
          @classmethod
          def func(cls):
              print(cls)  # 獲取B類的類空間(<class '__main__.B'>)
              cls.name = "djb"    # 給B類添加靜態屬性
      
      class B(A):
          pass
      
      B.func()
      print(B)  # <class '__main__.B'>
      print(B.__dict__) # {'__module__': '__main__', '__doc__': None, name': 'djb'}
  2. 靜態方法

    靜態方法是類中的函數,不需要實例。靜態方法主要是用來存放邏輯性的代碼,邏輯上屬於類,但是和類本身沒有關係,也就是說在靜態方法中,不會涉及到類中的屬性和方法的操作。可以理解為,靜態方法是個獨立的、單純的函數,它僅僅托管於某個類的名稱空間中,便於使用和維護。

    import time
    
    class TimeTest(object):
        def __init__(self, hour, minute, second):
            self.hour = hour
            self.minute = minute
            self.second = second
    
        @staticmethod
        def showTime():
            return time.strftime("%H:%M:%S", time.localtime())
    
    print(TimeTest.showTime())   # 12:07:02
    t = TimeTest(2, 10, 10)
    nowTime = t.showTime()
    print(nowTime)              # 12:07:02

    如上,使用了靜態方法(函數),然而方法體中並沒使用(也不能使用)類或實例的屬性(或方法)。若要獲得當前時間的字元串時,並不一定需要實例化對象,此時對於靜態方法而言,所在類更像是一種名稱空間。

    其實,我們也可以在類外面寫一個同樣的函數來做這些事,但是這樣做就打亂了邏輯關係,也會導致以後代碼維護困難。

  3. 屬性

    屬性 : 將一個方法偽裝成一個 屬性,在代碼的級別上沒有本質的提升,但是讓其看起來跟合理。

    什麼是特性property

    property是一種特殊的屬性,訪問它時會執行一段功能(函數)然後返回值

    為什麼要用property

    將一個類的函數定義成特性以後,對象再去使用的時候obj.name,根本無法察覺自己的name是執行了一個函數然後計算出來的,這種特性的使用方式遵循了統一訪問的原則

    class Goods:
    
        def __init__(self, original_price, discount):
            self.original_price = original_price
            self.discount = discount
    
        @property
        def price(self):
            new_price = float(self.original_price) * float(self.discount)
            return new_price
    
        # 修改原價
        @price.setter
        def price(self, value):
            if isinstance(value, int):
                self.original_price = value
            else:
                raise TypeError("{0} must be in int".format(value))
    
        # 刪除原價
        @price.deleter
        def price(self):
            del self.original_price
    
    
    good = Goods(100, 0.8)
    # 獲取商品價格
    print(good.price)        # 80.0
    
    # 修改商品價格
    good.price = 89
    print(good.price)        # 71.2

四、類的約束

抽象類:抽象類是一個介於類和介面之間的一個概念,同時具備類和介面的部分特性,可以用來實現歸一化設計。

Python中沒有介面類這種東西。

引入抽象類的概念對類進行約束:

from abc import ABCMeta, abstractmethod

class Payment(metaclass=ABCMeta):    # 抽象類 規範和約束  metaclass指定的是一個元類
    @abstractmethod
    def pay(self): pass     # 抽象方法

class WeChatPay(Payment):
    def pay(self, money):
        print("使用微信支付了{0}元".format(money))

class AliPay(Payment):
    def pay(self, money):
        print("使用支付寶支付了{0}元".format(money))

class JdPay(Payment):
    pass
    # def pay(self, money):
        # print("使用京東支付了{0}元".format(money))

def pay(obj, money):
    obj.pay(money)


ali = AliPay()
wechat = WeChatPay()    # 歸一化設計:不管是哪一個類的對象,都調用同一個函數去完成相似的功能
jd = JdPay()    # JdPay沒有實現父類中的抽象類pay方法,在實例化對象時會報錯

pay(ali, 300)
pay(wechat, 500)

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

-Advertisement-
Play Games
更多相關文章
  • netty服務端啟動 ServerBootstrap源碼解析 前面的第一篇文章中,我以spark中的netty客戶端的創建為切入點,分析了netty的客戶端引導類Bootstrap的參數設置以及啟動過程。顯然,我們還有另一個重要的部分 服務端的初始化和啟動過程沒有探究,所以這一節,我們就來從源碼層面 ...
  • 觀察者模式主要用於處理對象間的一對多的關係,是一種對象行為模式。該模式的實際應用場景比較容易確認,當一個對象狀態發生變化時,所有該對象的關註者均能收到狀態變化通知,以進行相應的處理。本文希望通過簡單的介紹和分析,能讓讀者對觀察者模式有一個簡單直觀的認識和感知,以便在實際開發中根據需要靈活運用。 1. ...
  • 舉個慄子 故事是這樣的... 一個小伙子喜歡上了隔壁班的一個妹子,但是又不認識,也害羞不好意思主動去說話,於是拜托了同樣在這個班的一個朋友去傳遞自己想要送的禮物。。。 代碼實現 該模式就不上什麼簡單實現了,直奔完整實現。 被追求者 想要送的禮物 追求者 代替追求者的人 測試 測試結果 代理模式 定義 ...
  • 我最近比較了[]和list()的處理速度,並且驚訝地發現[]運行速度比list()快三倍以上。我跑了相同的測試與{}和dict(),結果幾乎相同:[]和{}兩個花了大約0.128sec /百萬次,而list()和dict()大約花費每個0.428sec /萬次。 後來我查了查原因,得到的結論如下: ...
  • 下載Spring Spring官網並不直接提供Spring的下載,Spring現在托管在GitHub上。 1、進入Spring官網 -> PROJECTS -> SPRING FRAMEWORK 2、點擊GitHub的圖標,進入GitHub 3、進入Spring倉庫後 org -> springfr ...
  • IDEA下創建Java SE Spring項目示例 1、創建項目 第4步:是否自動創建空的Spring容器配置文件,預設文件名是spring-config.xml。勾不勾選都行,如果沒勾選,後面要自己創建。 第5步:設置如何添加Spring要用到的庫? Use library:從磁碟上選擇要添加的S ...
  • 有時候除了測量演算法的具體性能指數,我們也會希望測試出演算法的時間複雜度,以便我們對待測試的演算法的性能有一個更加直觀的瞭解。 測量時間複雜度 google benchmark已經為我們提供了類似的功能,而且使用相當簡單。 具體的解釋在後面,我們先來看幾個例子,我們人為製造幾個時間複雜度分別為 , , 的 ...
  • 1、相關軟體與環境準備 1.1 GO 安裝 下載地址, "https://studygolang.com/dl" ,選擇 Windows 版,本文安裝到 D:\Go 1.2 LiteIDE 安裝 下載地址, "http://liteide.org/cn/download/" 可以找到去下載的地方。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...