由于Python是動(dòng)態(tài)語(yǔ)言橄维,根據(jù)類(lèi)創(chuàng)建的實(shí)例可以任意綁定屬性。
給實(shí)例綁定屬性的方法是通過(guò)實(shí)例變量描验,或者通過(guò)self
變量:
class Student(object):
def __init__(self, name):
self.name = name
s = Student('Bob')
s.score = 90
但是椒功,如果Student
類(lèi)本身需要綁定一個(gè)屬性呢捶箱?可以直接在class
中定義屬性,這種屬性是類(lèi)屬性动漾,歸Student
類(lèi)所有:
class Student(object):
name = 'Student'
當(dāng)我們定義了一個(gè)類(lèi)屬性后丁屎,這個(gè)屬性雖然歸類(lèi)所有,但類(lèi)的所有實(shí)例都可以訪問(wèn)到旱眯。來(lái)測(cè)試一下:
>>> class Student(object):
... name = 'Student'
...
>>> s = Student() # 創(chuàng)建實(shí)例s
>>> print(s.name) # 打印name屬性晨川,因?yàn)閷?shí)例并沒(méi)有name屬性,所以會(huì)繼續(xù)查找class的name屬性
Student
>>> print(Student.name) # 打印類(lèi)的name屬性
Student
>>> s.name = 'Michael' # 給實(shí)例綁定name屬性
>>> print(s.name) # 由于實(shí)例屬性?xún)?yōu)先級(jí)比類(lèi)屬性高删豺,因此共虑,它會(huì)屏蔽掉類(lèi)的name屬性
Michael
>>> print(Student.name) # 但是類(lèi)屬性并未消失,用Student.name仍然可以訪問(wèn)
Student
>>> del s.name # 如果刪除實(shí)例的name屬性
>>> print(s.name) # 再次調(diào)用s.name呀页,由于實(shí)例的name屬性沒(méi)有找到妈拌,類(lèi)的name屬性就顯示出來(lái)了
Student
從上面的例子可以看出,在編寫(xiě)程序的時(shí)候蓬蝶,千萬(wàn)不要對(duì)實(shí)例屬性和類(lèi)屬性使用相同的名字尘分,因?yàn)橄嗤Q(chēng)的實(shí)例屬性將屏蔽掉類(lèi)屬性猜惋,但是當(dāng)你刪除實(shí)例屬性后,再使用相同的名稱(chēng)培愁,訪問(wèn)到的將是類(lèi)屬性著摔。