學習python:實例屬性和類屬性

簡介:

我們常寫的python代碼中如果給一個對象增加一個屬性,比如給一個Student類增加一個name屬性,那麼可以直接在__init__(self, name)增加一個self.name = name即可。這樣每新建一個對象,就會有一個對應的name屬性與之對應,且對象之間的name是不共享的。如下:

class Student(object):
    def __init__(self, name):
        self.name = name

然而有時候我們希望讓所有新建出來的對象共享同樣的一個屬性,這時候就需要用到類屬性的概念了。在面向對象的語言中,我們總是說一切皆對象,因此可以把我們新定義的類看做一個類對象,這樣給類添加的屬性叫做類屬性。其表現形式爲如下:

class Student(object):
    # 屬性
    num = 0                     # 類屬性
    # 方法
    def __init__(self, name):
        self.name = name        # 實例屬性

舉個類比的例子,類屬性的作用有點像全局變量:我們爲了讓全局範圍內都能夠訪問一個變量,可以定義一個全局變量;而爲了讓所有的對象都能夠訪問同一個變量,就可以定義一個類屬性來滿足需求。

新建一個對象的機制

當一個類定義完成後,一但創建一個該類的實例對象,該實例保存了兩樣東西:

  1. 實例屬性,也就是我們通過__init()__方法給它的一些屬性(通常我們都是這麼做的)。在對象之間不可以共享。
  2. 一個特殊的屬性,知道該實例是通過那個類創建的。(這樣做的好處是沒有保存該類的各種方法,而是隻在類中定義了一份,以節省空間)

從上面的分析來看,一個類爲了保存各種方法,因此也是要內存空間的,因此一個**類對象**也可以包含兩樣東西:

  1. 類屬性,可以在對象之間共享。
  2. 各種方法

一個例子

類屬性歸類所有

還是以Student爲例,我們有如下需求:

每新實例化一個Student類都有一個計數器來記錄當前已經創建了多少個對象了.

因此可以使用類屬性做到這個需求,代碼如下:

class Student(object):

    num = 0

    def __init__(self, name):
        self.name = name
        Student.num += 1        # 注意這裏使用的不是self.num,而是Student.num

    def get_num(self, ):
        return Student.num      # 注意這裏使用的不是self.num,而是Student.num 

s1 = Student('xiaoming')
print(s1.get_num())

s2 = Student('xiaohong')
print(s2.get_num())

s3 = Student('huluwa')
print(s3.get_num())

#---
# Output
1
2
3

從輸出的結果可以看出,所有的對象都是共享類屬性的。

類屬性可以通過實例對象調用

當我們定義了一個類屬性後,這個屬性雖然歸類所有,但類的所有實例都可以訪問到。如下:

class Student(object):

    num = 0

    def __init__(self, name):
        self.name = name
        Student.num += 1        # 注意這裏使用的不是self.num,而是Student.num

    def get_num(self, ):
        return Student.num      # 注意這裏使用的不是self.num,而是Student.num 

s1 = Student('xiaoming')
print(s1.num)                   # 這裏直接通過對象訪問類屬性依然可以訪問到

s2 = Student('xiaohong')
print(s2.num)

s3 = Student('huluwa')
print(s3.num)

#---
# Output
1
2
3

注意:

類屬性和實例屬性儘量不要用同樣的名字,否則通過對象調用類屬性時,會被相同名字的實例屬性覆蓋。詳情見[1].

總結

綜上,我們可以總結實例屬性和類屬性有如下特點:

  • 實例屬性:
    和具體的某個實力對象有關係,並且一個實例對象和另一個實例對象是不共享屬性的。

  • 類屬性:
    類屬性所屬於類對象,並且多個實例對象之間共享同一個類屬性。

參考

[1]. 廖雪峯python

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章