上一節主要記錄面向對象編程的思想以及Python類的簡單建立,這節繼續深刻類中變量的相關知識,Here we go!html
類變量定義:在類中,在函數體(方法)外的變量稱爲類變量。類變量在整個類中是公用的編程
類變量初始化:按照以上定義,類變量的初始化以下函數
1 class Doctor: 2 ''' 3 類變量的初始化 4 ''' 5 salary = 100 # salary爲類變量 6 7 def talk(): 8 print('I am a doctor')
類變量訪問:由於類變量在整個類中是公用的,因此在不一樣的環境下都能訪問。在類中函數體外直接使用 類變量 訪問;在類中函數體內使用 類.類變量 或者 實例.類變量 訪問;在類外使用 類.類變量 或者 實例.類變量訪問spa
class Doctor: ''' 在類中函數體外訪問類變量salary ''' salary = 100 print(salary) def talk(self): print('I am a doctor') lisi = Doctor() # 一旦實例化後,就會自動按順序執行類中函數體外的代碼 # 運行結果: 100
class Doctor: ''' 在類中函數體內訪問類變量salary ''' salary = 100 def talk0(self): ''' 使用類.類變量訪問 ''' print('My salary is {0}'.format(Doctor.salary)) def talk1(self): ''' 使用實例.類變量訪問 ''' print('My salary is {0}'.format(self.salary)) lisi = Doctor() lisi.talk0() lisi.talk1() # 運行結果: My salary is 100 My salary is 100
class Doctor: ''' 在類外訪問類變量salary ''' salary = 100 def talk(self): print('I am a doctor') lisi = Doctor() print(Doctor.salary) # 使用 類.類變量 訪問 print(lisi.salary) # 使用 實例.類變量 訪問 # 運行結果: 100 100
實例變量定義:在類中,在函數體(方法)內的變量稱爲實例變量。code
實例變量初始化:按照上面定義,實例變量的初始化以下orm
1 class Doctor: 2 ''' 3 初始化實例變量 4 ''' 5 6 def talk(self): 7 self.sentence = 'I am man' # self.sentence 爲實例變量
實例變量訪問:實例變量在整個類中並非公用的,因此其訪問範圍有限。在類中函數體內使用 實例.實例變量 訪問;在類外使用 實例.實例變量 訪問htm
class Doctor: ''' 類中函數體內的訪問 ''' def talk(self): self.sentence = 'I am man' # 初始化實例變量self.sentence print(self.sentence) # 訪問實例變量 lisi = Doctor() lisi.talk() # 調用talk方法 # 運行結果: I am man
class Doctor: ''' 類外訪問實例變量 ''' def talk(self): self.sentence = 'I am man' # 初始化實例變量self.sentence lisi = Doctor() lisi.talk() # 必須先執行talk方法才能訪問talk方法裏面的實例變量 print(lisi.sentence) # 類外訪問實例變量
在Python基礎教程中講解了全局變量與局部變量的相關知識,本節提到的兩個變量與它們有什麼異同呢?對象
絕對來講,類變量與實例變量都是局部變量blog
相對來講,在類中,類變量至關於全局變量,但實例變量並不至關於局部變量,更不至關於全局變量教程
相對來講,在實例中,類變量和實例變量都至關於全局變量
一會兒說的這麼複雜難以理解,舉個栗子🌰就明白了:
class Doctor: salary = 100 def talk(self): ¦ print('I am a doctor') print(salary) # salary是Doctor的類變量,在類中定義 # 但在主程序中並不能被正確訪問 # 由於salary變量是局部變量 # 運行結果: Traceback (most recent call last): File "8.py", line 8, in <module> print(salary) NameError: name 'salary' is not defined # 拋出變量未定義異常
class Doctor: def talk(self): self.salary = 100 print(salary) # 一樣,實例變量self.salary也是局部變量 # 運行結果: Traceback (most recent call last): File "9.py", line 6, in <module> print(salary) NameError: name 'salary' is not defined # 拋出變量未定義異常
class Doctor: def talk(self): self.salary = 100 Doctor().talk() print(salary) # 即便執行了talk方法,也不能正確訪問 # 由於它至始至終都是局部變量 # 運行結果: Traceback (most recent call last): File "9.py", line 12, in <module> print(salary) NameError: name 'salary' is not defined
class Doctor: salary = 100 print(salary) def talk(self): print(Doctor.salary) def eat(self): print(Doctor.salary) lisi = Doctor() lisi.talk() lisi.eat() # 由於類變量在整個類中都是共有的 # 所以類變量能被類中的方法訪問 # 換句話說,在類中類變量至關於全局變量
# 運行結果:
100
100
100
class Doctor: salary = 100 print(salary) def talk(self): self.food = 'BaoZi' print(Doctor.salary) print(self.food) def eat(self): print(Doctor.salary) print(self.food) lisi = Doctor() lisi.talk() lisi.eat() # 在talk方法裏面定義實例變量self.food # 可是在eat方法裏面卻能夠訪問self.food這個實例變量 #(前提是必須先運行talk方法,就至關於初始化self.food) # 所以,在實例中,類變量和實例變量都至關於全局變量 # 運行結果:
100
100
BaoZi
100
BaoZi
class Doctor: def talk(self): salary = 100 print(salary) def eat(self): print(salary) lisi = Doctor() lisi.talk() lisi.eat() # 在類中talk方法裏定義局部變量salary # 在其餘方法中是不能被訪問的 # 運行結果: 100 Traceback (most recent call last): File "12.py", line 13, in <module> lisi.eat() File "12.py", line 8, in eat print(salary) NameError: name 'salary' is not defined
「類變量在類中函數體內有兩種訪問方式: 類.類變量 和 實例.類變量 ,這兩種方式會帶來不一樣的後果。使用 實例.類變量 訪問類變量後,實際上是從新建立了一個新的實例變量: 實例.實例變量 ,與類變量已經無關了」
class Doctor: salary = 100 # 初始化類變量salary def talk0(self): print('talk0:', Doctor.salary) Doctor.salary = 200 # 修改類變量salary的值爲200 def talk1(self): print('talk1:', Doctor.salary) print('talk1:', self.salary) self.salary = 300 # 修改self.salary的值爲300 def talk2(self): print('talk2:', self.salary) print('talk2:', Doctor.salary) # 輸出的類變量並無被改變爲300 lisi = Doctor() lisi.talk0() lisi.talk1() lisi.talk2() # 運行結果: talk0: 100 talk1: 200 talk1: 200 talk2: 300 talk2: 200
強烈建議:類變量的訪問方法用 類.類變量
本小節介紹了Python中類的各類變量知識,在實際使用中要有深入的理解才行。以後會記錄類的傳參、類的性質、類的屬性方法等,拜拜~~