首頁 >後端開發 >Python教學 >有關類的公有屬性的介紹

有關類的公有屬性的介紹

巴扎黑
巴扎黑原創
2017-07-17 15:58:061577瀏覽

一、概念

  我們前面提到類別的私有屬性,也就是類別中不能直接存取的。但是不是可以直接存取的屬性就是公有屬性呢?其實也不是。在__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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn