類屬性,也就是靜態屬性,可以使用類名來呼叫靜態屬性,或者使用物件名也可以呼叫靜態屬性
物件屬性:就是初始化方法中建立的屬性,可以使用物件名來呼叫靜態屬性;但是不可以使用類名去呼叫乙個物件屬性;
class course(): #執行結果:類名 language='
chinese'#
類屬性,靜態屬性
def__init__(self,name,teacher,period): #
初始化方法
self.name=name #
物件屬性
self.teacher=teacher
self.period=period
c1=course('
python
','xuanxuan
','6 months
') #
例項化乙個類,建立乙個類物件
print(c1.language) #
可以使用物件名呼叫乙個動態屬性
print(course.language) #
可以使用類名呼叫類屬性(動態屬性)
print(c1.name) #
可以使用物件名檢視物件的屬性
但是當我試圖想要使用類名去呼叫物件屬性時,是會報錯的~
print(course.name) #執行結果:不能使用類名去呼叫乙個物件的屬性~
其實理解起來也很簡單,比如對於這個course類,我們可以例項化出很多不同的物件:
c1=course('這樣就可以例項化出兩個物件,但是當我們course.name時你就不知道要呼叫哪乙個屬性了吧 ,其實物件屬性是專屬於物件的,類名是不能去呼叫的。python
','xuanxuan
','6 months')
c2=course('
linux
','璇璇
','3 weeks
')
其實內部實質是這樣的:
就是當我定義乙個類時,他會給course類建立乙個命名空間,存放的是,類屬性(靜態屬性),初始化方法名,其他的方法名(比如course類中還有其他的一些方法func()-,所以當我們使用類名去呼叫類屬性(靜態方法時是完全沒問題的,因為類屬性就在這個類的命名空間中)你看類course的命名空間裡是沒有物件的一些屬性的;
當我們對類例項化成乙個物件時,比如pyhton=course(''),我們就會給這個物件建立乙個新的命名空間python,由於在呼叫course這個類時,建立了乙個python物件,python物件開闢了乙個新的命名空間,裡面放的就是該物件的一些屬性,但是python這個物件肯定知道是由誰例項化的,物件肯定能找到它所呼叫的那個類,這就有了類物件指標(由物件指向它所呼叫的類),所以當我們使用物件名去呼叫類屬性(存在於類的命名空間中)時,首先會在自己的命名空間中找,找不到就去類物件指標指向的那個類的命名空間中去查詢,找到了就返回值,所以這就是使用物件名也可以呼叫類屬性的原因。
但是類物件指標只能是由物件指向它所呼叫的類,不能反過來,因為可能會有很多物件是由乙個類例項化出來的,所以只能是單線,這就是為什麼類名不能呼叫屬性名~
當我們通過類名去修改類屬性時,例項化這個類的所有物件在使用物件名呼叫這個類屬性時都會發生變化,因為這些物件都是通過各自的類物件指標指向它們所例項化的這個類,當類的這個命名空間中的類屬性修改之後,當物件名呼叫這個類屬性時,通過類物件指標找到這個類屬性也變了~
class course(): #執行結果:類名 language='
chinese'#
類屬性,動態屬性
def__init__(self,name,teacher,period): #
初始化方法
self.name=name #
物件屬性
self.teacher=teacher
self.period=period
c1=course('
python
','xuanxuan
','6 months
') #
類例項化建立物件c1
c2=course('
linux
','璇璇
','3 weeks')
print('
類屬性修改之前:
',course.language)
print(course.__dict__
)course.language='中文'
print('
類屬性修改之後:
',course.language)
print(course.__dict__) #
其實列印的是類的一些屬性和方法
print(c1.language) #
可以使用物件名呼叫類屬性
print(c1.__dict__) #
但是這個物件的命名空間裡是沒有language這個類屬性的,它能取到值是通過類物件指標找到類命名空間中的這個類屬性的~
print(c2.language) #
發現由類名修改類屬性之後,物件名呼叫這個類屬性時,結果都是會發生變化的~
print(c2.__dict__)
我們知道物件名可以呼叫類屬性,也知道使用類名也可以呼叫類屬性,並且使用類名修改類屬性時 面對類例項化得到的物件呼叫類屬性時都會發生變化~
但是當我們企圖使用物件名修改類屬性時會發生什麼呢:
class course(): #執行結果:類名 language='
chinese'#
類屬性,動態屬性
def__init__(self,name,teacher,period): #
初始化方法
self.name=name #
物件屬性
self.teacher=teacher
self.period=period
c1=course('
python
','xuanxuan
','6 months
') #
類例項化建立物件c1
c2=course('
linux
','璇璇
','3 weeks')
print('
物件名呼叫類屬性修改之前:
',c1.__dict__
)c1.language='中文'
print('
物件名呼叫類屬性修改之後:
',c1.__dict__
(c1.language)
print("
c1物件呼叫類屬性修改之後,c2物件呼叫類屬性 和 類名呼叫類屬性的情況:")
(course.language)
print('
course:
',course.__dict__
(c2.language)
print('
c2:',c2.__dict__)
發現,c1物件呼叫類屬性時,「修改前後」的變化是:之前c1命名空間中是沒有類屬性的,「修改之後」命名空間中卻有了! 其實是因為c1.language=『中文』,是在賦值!!就是會在c1物件的命名空間中建立了這個屬性,所以當c1這個物件去查詢這個類屬性時,就會現在本地明明空間查詢,查詢到了,就不會通過類物件指標再去類的命名空間找了,所以會看到c1呼叫類屬性時結果會變化
然而類中的這個類屬性還是原來的那個啊,所以類呼叫類屬性時會直接在類的命名空間中找,而且c2類物件指標還是會指向例項化的類,c2呼叫類屬性時在本地找不到,就去類命名空間中找;
前端學習Day23
一 查詢 查詢 由裝置型別 監測裝置特性表示式構成。語法 media 裝置型別 all screen and 條件表示式 注 1 and兩側必須有空格 2 not放在裝置型別的前面 反向選擇 排除某個範圍 3 查詢 做樣式微小調整,例如 浮動,顯示隱藏,文字大小,寬高 二 移動端準備工作 1 met...
day23 系統服務
今日內容 1.系統服務 1.開機啟動流程 2.centos6與centos7區別 3.系統的執行級別 1.centos6 臨時性的操作 root oldboy runlevel 檢視級別 n 3 n 表示上一次是什麼級別 3 當前系統正在執行的級別 root oldboy init 3 切換到3級別...
實習日記 Day23
今天是週三,一周之中的 駝峰日 駝峰日通常是一周中最難過的日子,但也是最充滿希望的時日,過去了就是週末了。今天的task數量之多,達到了我入職以來的頂峰呢,刺激 犯了低階的錯誤呢 快下班時,leader突然在skype找我了,甩過來乙個鏈結,問我用 賬號能不能登陸。我一看,不正是我上週已經交付的任務...