一、概念
我們前面提到類別的私有屬性,也就是類別中不能直接存取的。但是不是可以直接存取的屬性就是公有屬性呢?其實也不是。在__init__()建構函式中的屬性,對外基本上都可以訪問,但是他們並不是公有屬性。那什麼叫公有屬性呢?
定義: 指的是所屬這個類別的所有對象,都可以存取的屬性,叫做公有屬性。
二、屬性
2.1 成員屬性
class Person(object): def __init__(self, name, job, phone, address): self.name = name # 成员属性,属于某个实例对象 self.job = job self.phone = phone self.__address = address def get_private(self): return self.__address def sayhi(self): print("hell,%s" % self.name) p1 = Person('Bigberg', 'Doctor', '8833421', 'hz') p2 = Person('Ashlex', 'Police', '8833232', 'bj')
print(p1.job, p2.job) # 输出 Doctor Police
我們在Person類別下定義了兩個對象,p1和p2。很顯然我們沒有辦法讓p1來存取p2 的job屬性,也就是Police。那麼在建構子__init__()中的self.name等屬性,稱為 成員屬性。
2.2 公有屬性
class Person(object): nationality = 'CN' # 定义公有属性 def __init__(self, name, job, phone, address): self.name = name self.job = job self.phone = phone self.address = address def sayhi(self): print("hell,%s" % self.name) p1 = Person('Bigberg', 'Doctor', '8833421', 'hz') p2 = Person('Ashlex', 'Police', '8833232', 'bj') print(p1.nationality) print(p2.nationality) # 输出 CN CN
公有屬性而言,所有實例物件存取它所得到的值是一樣的。
三、公有屬性的特性
我們不僅可以訪問,還能改變公有屬性。
class Person(object): nationality = 'CN' # 定义公有属性 def __init__(self, name, job, phone, address): self.name = name self.job = job self.phone = phone self.address = address def sayhi(self): print("hell,%s" % self.name) p1 = Person('Bigberg', 'Doctor', '8833421', 'hz') p2 = Person('Ashlex', 'Police', '8833232', 'bj') print(Person.nationality) # 调用 公有属性 Person.nationality = 'us' # 改变 公有属性 print(Person.nationality) #输出 CN us
#3.1 單一實例呼叫與改變公有屬性
# 依据上例 print("--------Befoer change---------") print(Person.nationality) print(p1.nationality) print(p2.nationality) print("--------after change---------") print(Person.nationality) p1.nationality = 'JP' print(p1.nationality) print(p2.nationality) # 输出
---- ----Befoer change---------
CN
CN
CN
--------after change---------
US
JP
US
p1在修改之前我們可以很好理解,因為大家都是呼叫的類別Person的公有屬性nationality,所以p1、p2的國籍屬性是一樣的,都是'CN'。但是為什麼在p1修改過公有屬性後,p2的國籍屬性沒有改變呢?
在我們定義一個Person類別的時候,其實在記憶體中就已經存在了,當然也包含了這個類的公有屬性。在最初實例p1去呼叫類別Person的nationality這個屬性時,是直接引用類別當中nationality的記憶體位址,而不是自己新增一個屬性叫nationality。
這就可以解釋為什麼在Person類別中的nationality改變為 'US' 時,p2也跟著改變。因為是直接引用記憶體當中的值。
print(id(Person.nationality)) print(id(p1.nationality)) print(id(p2.nationality)) print(Person.nationality, p1.nationality, p2.nationality) #输出 1751236836128 1751236836128 1751236836128 CN CN CN
在p1直接賦值nationality這個屬性後,其實就實例p1為自己新增了一個成員變量,叫做nationality。只是他們的名稱相同而已,但是兩者之 間並沒有聯繫,甚至內存地址也不相同。
p1.nationality = 'JP'
所以p1.nationality='JP',並沒有修改類別Person的公有屬性,而是為自己創造了一個新的成員屬性,因此p1的改變對類別的公有屬性沒有影響。
以上是有關類的公有屬性的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Atom編輯器mac版下載
最受歡迎的的開源編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)