您的“關注”和“點贊”,是信任,是認可,是支持,是動力…
如意見相佐,可留言。
本人必將竭盡全力試圖做到準確和全面,終其一生進行修改補充更新。
文章目錄
1 類中的變量分類介紹
類體中的屬性,指的就是類中的變量。
在類體中,根據變量定義的位置不同,以及定義的方式不同,類中的屬性可細分爲以下三種類型,如下所示:
- 類體中,所有函數之外:此範圍定義的變量,稱爲
類屬性或類變量
; - 類體中,所以函數內部:以“
self.變量名
”的方式定義的變量,稱爲實例屬性或實例變量
; - 類體中,所有函數內部:以“
變量名 = 變量值
”的方式定義的變量,稱爲局部變量
。
2 類變量(類屬性)
2.1 類變量(類屬性)概述
類變量指的是類體中、所有函數之外定義的變量。
舉例如下所示:
class User:
# 定義類變量
name = '碼農阿杰' # 類變量 name
age = 28 # 類變量 age
# 實例方法
def add_id(self, user_id):
print('添加用戶id的實例方法')
2.2 類變量(類屬性)的特點
類變量會被所有類的實例化對象都同時共享。
類變量的調用方式有兩種,如下所示,
(1)使用類的實例化對象調用類變量。
- 通過類對象可以調用所屬類中的類變量。此方式不建議使用,因爲如果實例變量和類變量同名時,使用類對象將無法調用類變量,它會首選實例變量(實例變量在第 3 小節會介紹。舉例也在第 3 小節)。
- 注意:通過類對象是無法修改類變量的。通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量。
(2)使用類名直接調用類變量。
- 通過類名不僅可以調用所屬類中的類變量,而且可以修改它的值。
- 通過類名訪問類變量之外,還可以動態的爲類和對象添加類變量。
- 注意:因爲類變量會被所有類的實例化對象都同時共享,所以,通過類名修改類變量的值,會影響所有的實例化對象。
舉例如下所示:
例一,(1)使用類的實例化對象調用。
class User:
# 定義類變量
name = '碼農阿杰'
age = 28
# 實例方法
def add_id(self, user_id):
print('添加用戶id的實例方法')
# (1)使用類的實例化對象調用類變量。
user = User() # 類的實例化(創建 User 類的對象)
print('修改前 類變量 name =', user.name)
print('修改前 類變量 age =', user.age)
print('------------------------------')
# 修改類變量的值
user.name = '阿杰'
user.age = 18
print('修改後 類變量 name =', User.name)
print('修改後 類變量 age =', User.age)
print('------------------------------')
# 通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量
print('通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量')
print('修改後 類變量 name =', user.name)
print('修改後 類變量 age =', user.age)
運行結果:
修改前 類變量 name = 碼農阿杰
修改前 類變量 age = 28
------------------------------
修改後 類變量 name = 碼農阿杰
修改後 類變量 age = 28
------------------------------
通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量
修改後 類變量 name = 阿杰
修改後 類變量 age = 18
例二,(2)使用類名直接調用。
class User:
# 定義類變量
name = '碼農阿杰'
age = 28
# 實例方法
def add_id(self, user_id):
print('添加用戶id的實例方法')
# (2)使用類名直接調用。
print('修改前 類變量 name =', User.name)
print('修改前 類變量 age =', User.age)
print('------------------------------')
# 修改類變量的值
User.name = '阿杰'
User.age = 18
print('修改後 類變量 name =', User.name)
print('修改後 類變量 age =', User.age)
print('------------------------------')
# 動態的爲類和對象添加類變量 gender
User.gender = '男'
print('動態的爲類和對象添加類變量 gender =', User().gender)
運行結果:
修改前 類變量 name = 碼農阿杰
修改前 類變量 age = 28
------------------------------
修改後 類變量 name = 阿杰
修改後 類變量 age = 18
------------------------------
動態的爲類和對象添加類變量 gender = 男
3 實例變量(實例屬性)
3.1 實例變量(實例屬性)概述
在任意類方法(構造方法或實例方法)內部以“self.變量名
”的方式定義的變量,叫做實例變量(或實例屬性)。
舉例如下所示:
class User:
# 構造方法
def __init__(self):
self.name = '碼農阿杰' # 實例變量 name
self.age = 28 # 實例變量 age
# 實例方法
def add_id(self):
self.user_id = 1 # 實例變量 user_id
3.2 實例變量(實例屬性)的特點
- 實例變量只作用於調用方法的對象。
- 實例變量只能通過對象名訪問,無法通過類名訪問。
- 如果實例變量和類變量同名,使用類對象將無法調用類變量,它會首選實例變量,這也是不推薦“類變量使用對象名調用”的原因。
- 注意:和類變量不同的是,通過某個對象修改實例變量的值,不會影響類的其它實例化對象,更不會影響同名的類變量。
舉例如下所示:
例一,實例變量只作用於調用方法的對象。
class User:
# 構造方法
def __init__(self):
self.name = '碼農阿杰'
self.age = 28
# 實例方法
def add_id(self):
self.user_id = 1
user = User() # 類的實例化(創建 User 類的對象)
# 由於 __init__(self) 構造方法是在創建類對象時自動調用,所以 User 類的類對象都會包含 name 和 age 實例變量
print(user.name)
print(user.age)
# 由於 user_id 實例變量在 add_id(self) 實例方法體中,如果 add_id(self) 實例方法沒有被調用,那麼 User 類的類對象中是不包含 user_id 實例變量的
print(user.user_id)
運行結果:
碼農阿杰
28
Traceback (most recent call last):
File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 162, in <module>
print(user.user_id)
AttributeError: 'User' object has no attribute 'user_id'
例二,實例變量只能通過對象名訪問,無法通過類名訪問。
class User:
# 構造方法
def __init__(self):
self.name = '碼農阿杰'
self.age = 28
# 實例方法
def add_id(self):
self.user_id = 1
user = User() # 類的實例化(創建 User 類的對象)
print('使用對象名訪問實例變量 name = ', user.name) # 實例變量只能通過對象名訪問
print('使用類名訪問實例變量 name = ', User.name) # 實例變量無法通過類名訪問。
運行結果:
使用對象名訪問實例變量 name = 碼農阿杰
Traceback (most recent call last):
File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 158, in <module>
print('使用類名訪問實例變量 name = ', User.name)
AttributeError: type object 'User' has no attribute 'name'
例三,
class User:
# 定義類變量
name = '阿杰'
age = 18
# 構造方法
def __init__(self):
self.name = '碼農阿杰'
self.age = 28
# 實例方法
def add_id(self):
self.user_id = 1
user = User() # 類的實例化(創建 User 類的對象)
# 如果實例變量和類變量同名,使用類對象將無法調用類變量,它會首選實例變量,
# 這也是不推薦“類變量使用對象名調用”的原因。
print('如果類變量和實例變量同名,通過類對象訪問類變量 name = ', user.name)
print('如果類變量和實例變量同名,通過類對象訪問類變量 age = ', user.age)
運行結果:
如果類變量和實例變量同名,通過類對象訪問類變量 name = 碼農阿杰
如果類變量和實例變量同名,通過類對象訪問類變量 age = 28
4 局部變量
4.1 局部變量概述
類方法中直接以 “變量名 = 值
” 的方式進行定義的變量,叫做局部變量。
舉例如下所示:
class User:
# 實例方法
def user_info(self):
name = '碼農阿杰' # 局部變量 name
age = 28 # 局部變量 age
print(name, age)
4.2 局部變量的特點
局部變量只能用於所在函數中,函數執行完成後,局部變量也會被銷燬。
舉例如下所示:
class User:
# 實例方法
def user_info(self):
name = '碼農阿杰' # 局部變量 name
age = 28 # 局部變量 age
print(name, age)
user = User()
user.user_info() # 執行 user_info() 方法,輸出結果,該方法執行完畢
# 局部變量 name 和 age ,只能用於所在方法中,方法執行完畢後,局部變量也會被銷燬。
print(user.name)
print(user.age)
運行結果:
碼農阿杰 28
Traceback (most recent call last):
File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 156, in <module>
print(user.name)
AttributeError: 'User' object has no attribute 'name'