您好,登錄后才能下訂單哦!
這篇文章主要介紹區分類屬性和實力屬性的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
我們知道,無論是在類中定義的屬性還是方法,在類的外部,都無法直接調用它們,因此,我們完全可以把類看做是一個獨立的作用域(稱為類命名空間),則類屬性其實就是定義在類命名空間內的變量(類方法其實就是定義的類命名空間中的函數)。
根據定義屬性的位置不同,類屬性又可細分為類屬性(后續用類變量表示)和實例屬性(后續用實例變量表示)。
類變量(類屬性)
類變量指的是定義在類中,但在各個類方法外的變量。類變量的特點是:所有類的實例化對象都可以共享類變量的值,即類變量可以在所有實例化對象中作為公用資源。
注意,類變量推薦直接用類名訪問,但也可以使用對象名訪問。
例如,下面代碼定義了一個 Address 類,并為該類定義了多個類屬性:
class Address : detail = '廣州' post_code = '510660' def info (self): # 嘗試直接訪問類變量 #print(detail) # 報錯 # 通過類來訪問類變量 print(Address.detail) # 輸出 廣州 print(Address.post_code) # 輸出 510660 #創建 2 個類對象 addr1 = Address() addr1.info() addr2 = Address() addr2.info() # 修改Address類的類變量 Address.detail = '佛山' Address.post_code = '460110' addr1.info() addr2.info()
該程序中,第二、三行代碼為 Address 定義了兩個類變量。當程序中第一次調用 Address 對象的 info() 方法輸出兩個類變量時,將會輸出這兩個類變量的初始值。接下來程序通過 Address 類修改了兩個類變量的值,因此當程序第二次通過 info() 方法輸出兩個類變量時,將會輸出這兩個類變量修改之后的值。
運行上面代碼,將會看到如下輸出結果:
廣州 510660 廣州 510660 佛山 460110 佛山 460110
實例變量(實例屬性)
實例變量指的是定義在類的方法中的屬性,它的特點是:只作用于調用方法的對象。
注意,實例變量只能通過對象名訪問,無法通過類名直接訪問。
Python 允許通過對象訪問類變量,但無法通過對象修改類變量的值。因為,通過對象修改類變量的值,不是在給“類變量賦值”,而是定義新的實例變量。
例如如下程序:
class Inventory: # 定義兩個類變量 item = '鼠標' quantity = 2000 # 定義實例方法 def change(self, item, quantity): # 下面賦值語句不是對類變量賦值,而是定義新的實例變量 self.item = item self.quantity = quantity # 創建Inventory對象 iv = Inventory() iv.change('顯示器', 500) # 訪問iv的item和quantity實例變量 print(iv.item) # 顯示器 print(iv.quantity) # 500 # 訪問Inventory的item和quantity類變量 print(Inventory.item) # 鼠標 print(Inventory.quantity) # 2000
上面程序中,第 8、9 行代碼通過實例對 item、quantity 變量賦值,看上去很像是對類變量賦值,但并不是,它們的作用是:重新定義了兩個實例變量。
類中,實例變量和類變量可以同名,但是在這種情況下,使用類對象將無法調用類變量,因為它會首選實例變量,因此這也是不推薦“類變量使用對象名調用”的原因。
上面程序在調用 Inventory 對象的 change() 方法之后,訪問 Inventory 對象的 item、quantity 變量,由于該對象本身己有這兩個實例變量,因此程序將會輸出該對象的實例變量的值;接下來程序通過 Inventory 訪問它的 item、quantity 兩個類變量,此時才是真的訪問類變量。
以上是區分類屬性和實力屬性的方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。