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
Tags: