例項屬性和類屬性

2021-08-20 15:13:06 字數 1742 閱讀 8831

例項屬性和類屬性

由於python是動態語言,根據類建立的例項可以任意繫結屬性。

給例項繫結屬性的方法是通過例項變數,或者通過self變數:

class

student

(object):

def__init__

(self, name):

self.name = name

s = student('bob')

s.score = 90

但是,如果student類本身需要繫結乙個屬性呢?可以直接在class中定義屬性,這種屬性是類屬性,歸student類所有:

class

student

(object):

name = 'student'

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

>>> 

class

student

(object):

... name = 'student'

...>>> s = student() # 建立例項s

>>> print(s.name) # 列印name屬性,因為例項並沒有name屬性,所以會繼續查詢class的name屬性

student

>>> print(student.name) # 列印類的name屬性

student

>>> s.name = 'michael'

# 給例項繫結name屬性

>>> print(s.name) # 由於例項屬性優先順序比類屬性高,因此,它會遮蔽掉類的name屬性

michael

>>> print(student.name) # 但是類屬性並未消失,用student.name仍然可以訪問

student

>>>

del s.name # 如果刪除例項的name屬性

>>> print(s.name) # 再次呼叫s.name,由於例項的name屬性沒有找到,類的name屬性就顯示出來了

student

從上面的例子可以看出,在編寫程式的時候,千萬不要對例項屬性和類屬性使用相同的名字,因為相同名稱的例項屬性將遮蔽掉類屬性,但是當你刪除例項屬性後,再使用相同的名稱,訪問到的將是類屬性。

為了統計學生人數,可以給student類增加乙個類屬性,每建立乙個例項,該屬性自動增加:

# -*- coding: utf-8 -*-
# 測試:

if student.count != 0:

print('測試失敗!')

else:

bart = student('bart')

if student.count != 1:

print('測試失敗!')

else:

lisa = student('bart')

if student.count != 2:

print('測試失敗!')

else:

print('students:', student.count)

print('測試通過!')

run例項屬性屬於各個例項所有,互不干擾;

類屬性屬於類所有,所有例項共享乙個屬性;

不要對例項屬性和類屬性使用相同的名字,否則將產生難以發現的錯誤。

類屬性和例項屬性

類屬性就是類物件所擁有的屬性,它被所有類物件的例項物件所共有,在記憶體中只存在乙個副本,這個和c 中類的靜態成員變數有點類似。對於公有的類屬性,在類外可以通過類物件和例項物件訪問 class people object name tom 公有的類屬性 age 12 私有的類屬性 p people p...

類屬性和例項屬性

1.不可修改型別 物件屬性只要賦值,那麼此物件用的屬性就是自己的屬性,不會再用同名的類屬性,類屬性的變化不會再影響到此物件。2.可修改型別 a.修改內部屬性的值,只要修改不是賦值,那麼修改會影響到所有物件以及類屬性。b.如果是重新賦值操作,效果等同於不可修改型別。class a books 三國 西...

類屬性和例項屬性

首先,得了解類的特殊屬性 dict 它是乙個字典,用於儲存類或者例項的屬性,即使你沒有去定義它,它也存在每個類中,是預設隱藏的。然後來看下面三個問題 class testa attr 1obj a testa testa.attr 42print obj a.attr print testa.dic...