寫給小白的Python之018:面向對象-私有成員、@property

来源:https://www.cnblogs.com/salmond/archive/2018/05/16/9001323.html
-Advertisement-
Play Games

導讀: 1.私有成員 2.@property 3.訪問對象信息 1. 私有成員 在某些情況下,我們希望限制用戶訪問對象的屬性或方法,也就是希望它是私有的,對外隱蔽。 那麼,如何在類中定義私有屬性或私有方法呢: 在屬性名或方法名前加上兩個下劃線__,使其不能在類的外部使用。 1.類的私有屬性 和 私有 ...


導讀:

1.私有成員

2.@property

3.訪問對象信息

1. 私有成員

在某些情況下,我們希望限制用戶訪問對象的屬性或方法,也就是希望它是私有的,對外隱蔽。

那麼,如何在類中定義私有屬性或私有方法呢: 在屬性名或方法名前加上兩個下劃線__,使其不能在類的外部使用。

1.類的私有屬性 和 私有方法,都不能通過對象直接訪問,但是可以在本類內部通過self訪問;

2.類的私有屬性 和 私有方法,都不會被子類繼承,子類也無法訪問;

3.私有屬性 和 私有方法 往往用來處理類的內部事情,不通過對象處理,避免數據在類的外部被修改,起到安全作用。

4. _x 單前置下劃線,私有化屬性或方法,在使用from xxx import *時都不會被導入,類對象和子類可以訪問,但不要隨便訪問。_類名__x可以訪問。

示例:

class A:
    __str = 'python'
    def __init__(self):
        self.__cook = "fire"

    def __f(self):
        return self.__str

    def f(self):
        return self.__str

a = A()
a.__str # 'A' object has no attribute '__str'
a.__f() # 'A' object has no attribute '__f'
a.f() # 輸出: python

修改對象屬性值

如果需要修改一個對象的屬性值,通常有2種方法:

  • 對象名.屬性名 = 數據 ----> 直接修改
  • 對象名.方法名() ----> 間接修改

私有屬性不能直接訪問,所以無法通過第一種方式修改,一般通過第二種方式修改私有屬性的值:定義一個可以調用的公有方法,在這個公有方法內訪問修改。

獲取和修改私有屬性

現代軟體開發中,通常會定義get_xxx()方法和set_xxx()方法來獲取和修改私有屬性值。

# 返回私有屬性的值
def get_xxx(self):
    return self.__xxx

# 接收參數,修改私有屬性的值
def set_xxx(self, num):
    self.__xxx = num

# 可以通過訪問公有方法set_xxx()來修改私有屬性的值
對象.set_xxx(100)

# 可以通過訪問公有方法get_xxx()來獲取私有屬性的值
print(對象.get_xxx())

 

2. @property

要調用那些私有屬性怎麼辦?

可以使用property函數。 請看下麵的例子:

__metaclass__ = type
class ProtectMe:

    def __init__(self):
        self.me = "xiao"
        self.__name = "kivi"

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        if len(name) > 10:
            print("name的長度太長了")
        self.__name = value


if __name__ == "__main__":
    p = ProtectMe()
    print(p.name)  # kivi
    p.name = "salmond"
    print(p.name)  # salmond

運行結果:
kivi
salmond

從上面可以看出, 用了@property之後, 再調用那個方法的時候, 用p.name的形式,就好像在調用以往非私有化屬性一樣。

把一個 getter 方法變成屬性,只需要加上@property 就可以了,此時,@property 本身又創建了另一個裝飾器@score.setter,負責把一個 setter 方法變成屬性賦值,於是,我們就擁有一個可控的屬性操作。至於裝飾器,我們以後再講。

3. 獲取對象信息

type(obj)

使用 type(obj) 來獲取對象的相應類型

>>> dog1 = Animal ( ’ dog1 ’ )
>>> type ( dog1 )
__main__. Animal

isinstance(obj, type)

使用 isinstance(obj, type) 判斷實例對象是否為指定的 type 類型的實例(類 classname 或其子類的實例)即`object._class `是 class_name 或其子類時返回 True。

>>> isinstance(object, class_name)
True

issubclass(class1, class2)

issubclass(class1, class2) :用於檢查類 class1 是不是 class2 的子類。例如 issubclass(bool, int) 會返回 True,因為 bool 是 int 的子類。

hasattr/getattr/setattr

  • 使用 hasattr(obj, attr) 判斷對象是否具有指定屬性/方法;
  • 使用 getattr(obj, attr[, default]) 獲取屬性/方法的值, 要是沒有對應的屬性則返回 default 值(前提是設置了 default),否則會拋出 AttributeError 異常;
  • 使用 setattr(obj, attr, value) 設定該屬性/方法的值,類似於 obj.attr=value。

dir(obj)

獲取對象所有屬性和方法名的列表。

 


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

-Advertisement-
Play Games
更多相關文章
  • 單例模式真是一個老掉牙的問題了,不過我今天是要說些裡面更深點的知識,閑話少說,直接來代碼 1、餓漢式 相信這種寫法大家都知道,一開始接觸單例的時候,大家應該都是用的這種方法: 這種方式優點就是線程安全, 缺點也很明顯,就是類載入的時候,就已實例化該對象了,後面有可能用不到這個實例對象,這樣就會造成空 ...
  • 剛畫出來的,MicroService Manager ...
  • 詳情請 咨詢 QQ 759104513 精品新增,持續中.... 192、PHP進階:面向對象及TP5框架初識-慕課網職業路徑 191、0961、手把手帶你入坑H5與小程式直播開發 190、SpringBoot2.0不容錯過的新特性 WebFlux響應式編程 189、Vue2.5開發去哪兒網App ...
  • 1.前言 可以這麼說的是,任何一種非強制性約束同時也沒有“標桿”工具支持的開發風格或協議(僅靠文檔是遠遠不夠的),最終的實現上都會被程式員冠上“務實”的名頭,而不管成型了多少個版本,與最初的設計有什麼區別。DDD 是如此,微服務是如此,REST 也是如此。 雖然這也不難理解,風格從一開始被創造出來後 ...
  • Java開源生鮮電商平臺-推薦系統模塊的設計與架構(源碼可下載) 業務需求: 對於一個B2B的生鮮電商平臺,對於買家而言,他需要更加快速的購買到自己的產品,跟自己的餐飲店不相關的東西,他是不關心的,而且過多無用的東西摻雜在一起,反而不便 於買家下單,用戶體驗也很差,嚴重的會因此丟了客戶。(客戶覺得太 ...
  • 想必學python的都會用pycharm來寫程式,可是pycharm總是需要註冊碼激活 server選項裡邊輸入 http://idea.imsxm.com/ (最近在server裡面輸入網址的方法不管用了,然後試了試在http://idea.lanyus.com/頁面里獲取驗證碼可以用了,所以到時 ...
  • 1.ThreadPoolExcuter原理說明 首先我們要知道為什麼要使用ThreadPoolExcuter,具體可以看看文檔中的說明: 線程池可以解決兩個不同問題:由於減少了每個任務的調用開銷,在執行大量的非同步任務時,它通常能夠提供更好的性能,並且還可以提供綁定和管理資源(包括執行集合任務時使用的 ...
  • C++ STL queue 容器優先隊列&&隊列 隊列 優先隊列(運算符重載)隊首為最小元素: 優先隊列,隊首為最大元素: 說明: 包含: 基本操作: x.push(y);//將y元素加入x隊列 x.size();//詢問x隊列長度 x.front()//訪問隊列x中最先加入的元素 x.back() ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...