我們前面提到類別的私有屬性,也就是類別中不能直接存取的。但是不是可以直接存取的屬性就是公有屬性呢?其實也不是。在__init__()建構函式中的屬性,對外基本上都可以訪問,但是他們並不是公有屬性。那什麼叫公有屬性呢?
定義: 指的是所屬這個類別的所有對象,都可以存取的屬性,叫做公有屬性。
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等屬性,稱為 成員屬性。
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
# 依据上例 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中文網其他相關文章!