Python中的類變數和成員變數
- 2022 年 6 月 16 日
- 筆記
類變數
-
定義
在類裡面定義,且不位於構造或者成員函數裡面,同時沒有" self. " 的前綴;或者在類外定義,用 類名.類變數名 來新增加類變數。
-
使用
兩種使用方法: (1)類名.類變數名(如下的 Test.a) (2)類的實例對象.類變數名(如下的 T.a)
exp:
class Test: a = 1 ### 類變數 def __init__(self): self.member = 2 def indoor(self, people): self.member = people T = Test() print(Test.a) ## 使用方法(1) print(T.a) ## 使用方法(2) >> 1 >> 1 -
作用範圍
類變數可以通過 使用方法(1)進行全局的修改(如操作1所示)
類變數通過 使用方法(2)只能進行局部的修改(如操作2所示)
也就是說 剛開始Test.a 和T1.a 還有 T2.a 都是指向同一地址,Test.a的修改只是修改地址里的值,而沒有修改地址,而直接修改實例化對象(如T1.a 或者 T2.a)的數值,會讓其實例對象的值指向新的記憶體空間,並且不再受到類變數Test.a的影響
exp:
class Test: a = 1 ### 類變數 def __init__(self): self.member = 2 def indoor(self, people): self.member = people T1 = Test() T2 = Test() print(T1.a) print(T2.a) print(Test.a) >> 1 >> 1 >> 1 ############ 操作1 ########### Test.a = 1000 print(T1.a) print(T2.a) print(Test.a) >> 1000 >> 1000 >> 1000 ############ 操作2 ########### T1.a = 2000 print(T1.a) print(T2.a) print(Test.a) >> 2000 >> 1000 >> 1000
成員變數(實例變數)
-
定義
在構造函數中 使用 「self.」 作為前綴的變數;或者在類的成員函數中使用「self.」 作為前綴的變數。其中前面一種定義在初始化類的時候即類實例創建的時候就產生了,而後面的定義只有當類的實例對象調用該成員函數時才被創建。
-
使用
在類實例化時或者在類實例調用包含有成員變數的函數時,需要給成員變數賦值。同時成員變數的使用只能使用 實例對象.成員變數名的形式(如 T.member; T.title),而不能使用類名來調用。
exp:
class Test: a = 1 def __init__(self): self.member = 2 ### 構造函數中的成員變數 def indoor(self): self.title = 3 ### 成員函數中的成員變數 T = Test() print(T.member) ## 成員變數的調用 T.indoor() ## 先調用含有成員變數的函數 print(T.title) ## 成員變數的調用 >> 2 >> 3 -
作用範圍
成員變數在不同的類實例對象之間不是全局的。對於一個類實例對象,其成員變數可以修改。也就說,一個類實例對象擁有一塊存儲區域用來存放成員變數,且成員變數的值可以修改,各個類實例對象的存儲區不重疊且不互通。
exp:
class Test: a = 1 def __init__(self): self.member = 2 def indoor(self): self.title = 3 T1 = Test() T2 = Test() ### 通過不同的類實例對象對於同一個成員變數進行修改 ### print(T1.member) T2.member = 5 print(T1.member) print(T2.member) ### 通過不同的類實例對象對於同一個成員變數進行修改 ### T1.indoor() print(T1.title) T2.indoor() T2.title = 7 print(T1.title) print(T2.title) >> 2 >> 2 >> 5 >> 3 >> 3 >> 7
局部變數
-
定義
在成員函數的內部定義變數,和普通的函數的局部變數概念一致
-
使用
和python中其他的局部變數的使用方法一致
-
作用範圍
只作用於該函數的內部,與普通函數的局部變數的作用域一致
exp:
class Test: a = 1 def __init__(self): self.member = 2 def indoor(self): total = 4 ## 局部變數;只在indoor函數內有效 self.title = 3 T = Test() T.indoor() print(T.total) ## 訪問不到局部變數 >> Traceback (most recent call last): File "main.py", line 10, in <module> print(T.total) AttributeError: Test instance has no attribute 'total'
還有一件事
class Test:
a = 1
self.b = 2 ## self.b 不能定義在最外層的 self只有在類的方法中才會有 指的是類實例對象本身 所以其算不上是成員變數還是類變數
def __init__(self):
self.member = 2
def indoor(self):
total = 4
self.title = 3
T = Test()
print(T.b)
>> Traceback (most recent call last):
File "main.py", line 1, in <module>
class Test(self,c):
NameError: name 'self' is not defined

